ScatterND

ScatterND - 18

版本

  • 名称: ScatterND (GitHub)

  • : main

  • 自版本: 18

  • 函数: False

  • 支持级别: SupportType.COMMON

  • 形状推断: True

此版本的运算符自版本 18起可用。

摘要

ScatterND 接受三个输入 data 秩为 r >= 1 的张量,indices 秩为 q >= 1 的张量,以及 updates 秩为 q + r - indices.shape[-1] - 1 的张量。运算的结果是通过创建输入 data 的副本,然后将其值更新为由 updates 指定的值,并在由 indices 指定的特定索引位置进行更新而产生的。它的输出形状与 data 的形状相同。

indices 是一个整数张量。设 k 表示 indices.shape[-1],即 indices 形状中的最后一个维度。indices 被视为 (q-1) 维度的 k 元组张量,其中每个 k 元组是 data 的部分索引。因此,k 的值最大可以是 data 的秩。当 k 等于 rank(data) 时,每个更新条目指定对张量的单个元素进行更新。当 k 小于 rank(data) 时,每个更新条目指定对张量的切片进行更新。索引值允许为负数,与从末尾反向计数的常用约定一致,但预期在有效范围内。

updates 被视为 (q-1) 维度的替换切片值张量。因此,updates.shape 的前 (q-1) 个维度必须与 indices.shape 的前 (q-1) 个维度匹配。updates 的其余维度对应于替换切片值。每个替换切片值是 (r-k) 维度的张量,对应于 data 的尾随 (r-k) 维度。因此,updates 的形状必须等于 indices.shape[0:q-1] ++ data.shape[k:r-1],其中 ++ 表示形状的串联。

output 通过以下等式计算

output = np.copy(data)
update_indices = indices.shape[:-1]
for idx in np.ndindex(update_indices):
    output[indices[idx]] = updates[idx]

上述循环中迭代的顺序未指定。特别是,索引不应具有重复的条目:也就是说,如果 idx1 != idx2,则 indices[idx1] != indices[idx2]。这确保了输出值不依赖于迭代顺序。

reduction 允许指定可选的约简操作,该操作应用于 updates 张量中的所有值,并将它们约简到指定 indices 上的 output 中。在 reduction 设置为“none”的情况下,索引不应具有重复的条目:也就是说,如果 idx1 != idx2,则 indices[idx1] != indices[idx2]。这确保了输出值不依赖于迭代顺序。当 reduction 设置为某个约简函数 f 时,output 按如下方式计算

output = np.copy(data)
update_indices = indices.shape[:-1]
for idx in np.ndindex(update_indices):
    output[indices[idx]] = f(output[indices[idx]], updates[idx])

其中 f+*maxmin,如指定的那样。

此运算符是 GatherND 的逆运算。

(Opset 18 更改): 将 max/min 添加到允许的约简操作集中。

示例 1

data    = [1, 2, 3, 4, 5, 6, 7, 8]
indices = [[4], [3], [1], [7]]
updates = [9, 10, 11, 12]
output  = [1, 11, 3, 10, 9, 6, 7, 12]

示例 2

data    = [[[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
            [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
            [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]],
            [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]
indices = [[0], [2]]
updates = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
            [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]]
output  = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
            [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
            [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]],
            [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]

属性

  • reduction - STRING (默认值为 'none')

    要应用的约简类型:none(默认)、add、mul、max、min。‘none’:不应用约简。‘add’:使用加法运算进行约简。‘mul’:使用加法运算进行约简。‘max’:使用最大运算进行约简。‘min’:使用最小运算进行约简。

输入

  • data (异构) - T

    秩为 r >= 1 的张量。

  • indices (异构) - tensor(int64)

    秩为 q >= 1 的张量。

  • updates (异构) - T

    秩为 q + r - indices_shape[-1] - 1 的张量。

输出

  • output (异构) - T

    秩为 r >= 1 的张量。

类型约束

  • T in ( tensor(bfloat16), tensor(bool), tensor(complex128), tensor(complex64), tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(string), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8) )

    将输入和输出类型约束为任何张量类型。

ScatterND - 16

版本

  • 名称: ScatterND (GitHub)

  • : main

  • 自版本: 16

  • 函数: False

  • 支持级别: SupportType.COMMON

  • 形状推断: True

此版本的运算符自版本 16起可用。

摘要

ScatterND 接受三个输入 data 秩为 r >= 1 的张量,indices 秩为 q >= 1 的张量,以及 updates 秩为 q + r - indices.shape[-1] - 1 的张量。运算的结果是通过创建输入 data 的副本,然后将其值更新为由 updates 指定的值,并在由 indices 指定的特定索引位置进行更新而产生的。它的输出形状与 data 的形状相同。

indices 是一个整数张量。设 k 表示 indices.shape[-1],即 indices 形状中的最后一个维度。indices 被视为 (q-1) 维度的 k 元组张量,其中每个 k 元组是 data 的部分索引。因此,k 的值最大可以是 data 的秩。当 k 等于 rank(data) 时,每个更新条目指定对张量的单个元素进行更新。当 k 小于 rank(data) 时,每个更新条目指定对张量的切片进行更新。索引值允许为负数,与从末尾反向计数的常用约定一致,但预期在有效范围内。

updates 被视为 (q-1) 维度的替换切片值张量。因此,updates.shape 的前 (q-1) 个维度必须与 indices.shape 的前 (q-1) 个维度匹配。updates 的其余维度对应于替换切片值。每个替换切片值是 (r-k) 维度的张量,对应于 data 的尾随 (r-k) 维度。因此,updates 的形状必须等于 indices.shape[0:q-1] ++ data.shape[k:r-1],其中 ++ 表示形状的串联。

output 通过以下等式计算:output = np.copy(data) update_indices = indices.shape[:-1] for idx in np.ndindex(update_indices): output[indices[idx]] = updates[idx] 上述循环中迭代的顺序未指定。特别是,索引不应具有重复的条目:也就是说,如果 idx1 != idx2,则 indices[idx1] != indices[idx2]。这确保了输出值不依赖于迭代顺序。

reduction 允许指定可选的约简操作,该操作应用于 updates 张量中的所有值,并将它们约简到指定 indices 上的 output 中。在 reduction 设置为“none”的情况下,索引不应具有重复的条目:也就是说,如果 idx1 != idx2,则 indices[idx1] != indices[idx2]。这确保了输出值不依赖于迭代顺序。当 reduction 设置为“add”时,output 按如下方式计算:output = np.copy(data) update_indices = indices.shape[:-1] for idx in np.ndindex(update_indices): output[indices[idx]] += updates[idx] 当 reduction 设置为“mul”时,output 按如下方式计算:output = np.copy(data) update_indices = indices.shape[:-1] for idx in np.ndindex(update_indices): output[indices[idx]] *= updates[idx] 此运算符是 GatherND 的逆运算。示例 1

  data    = [1, 2, 3, 4, 5, 6, 7, 8]
  indices = [[4], [3], [1], [7]]
  updates = [9, 10, 11, 12]
  output  = [1, 11, 3, 10, 9, 6, 7, 12]

示例 2

  data    = [[[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]
  indices = [[0], [2]]
  updates = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
             [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]]
  output  = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
             [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]

属性

  • reduction - STRING (默认值为 'none')

    要应用的约简类型:none(默认)、add、mul。‘none’:不应用约简。‘add’:使用加法运算进行约简。‘mul’:使用乘法运算进行约简。

输入

  • data (异构) - T

    秩为 r >= 1 的张量。

  • indices (异构) - tensor(int64)

    秩为 q >= 1 的张量。

  • updates (异构) - T

    秩为 q + r - indices_shape[-1] - 1 的张量。

输出

  • output (异构) - T

    秩为 r >= 1 的张量。

类型约束

  • T in ( tensor(bfloat16), tensor(bool), tensor(complex128), tensor(complex64), tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(string), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8) )

    将输入和输出类型约束为任何张量类型。

ScatterND - 13

版本

  • 名称: ScatterND (GitHub)

  • : main

  • since_version: 13

  • 函数: False

  • 支持级别: SupportType.COMMON

  • 形状推断: True

此版本的运算符已从版本 13开始可用。

概要

ScatterND 接受三个输入:data 张量,秩为 r >= 1;indices 张量,秩为 q >= 1;以及 updates 张量,秩为 q + r - indices.shape[-1] - 1。该运算的输出通过创建输入 data 的副本,然后将其值更新为 updates 指定的值,这些值位于由 indices 指定的特定索引位置。其输出形状与 data 的形状相同。请注意,indices 不应该具有重复的条目。也就是说,不支持对同一索引位置进行两次或多次 updates

indices 是一个整数张量。设 k 表示 indices.shape[-1],即 indices 形状中的最后一个维度。indices 被视为 (q-1) 维度的 k 元组张量,其中每个 k 元组是 data 的部分索引。因此,k 的值最大可以是 data 的秩。当 k 等于 rank(data) 时,每个更新条目指定对张量的单个元素进行更新。当 k 小于 rank(data) 时,每个更新条目指定对张量的切片进行更新。索引值允许为负数,与从末尾反向计数的常用约定一致,但预期在有效范围内。

updates 被视为 (q-1) 维度的替换切片值张量。因此,updates.shape 的前 (q-1) 个维度必须与 indices.shape 的前 (q-1) 个维度匹配。updates 的其余维度对应于替换切片值。每个替换切片值是 (r-k) 维度的张量,对应于 data 的尾随 (r-k) 维度。因此,updates 的形状必须等于 indices.shape[0:q-1] ++ data.shape[k:r-1],其中 ++ 表示形状的串联。

output 通过以下等式计算

output = np.copy(data)
update_indices = indices.shape[:-1]
for idx in np.ndindex(update_indices):
    output[indices[idx]] = updates[idx]

上述循环中迭代的顺序未指定。特别是,索引不应具有重复的条目:也就是说,如果 idx1 != idx2,则 indices[idx1] != indices[idx2]。这确保了输出值不依赖于迭代顺序。

此运算符是 GatherND 的逆运算。

示例 1

  data    = [1, 2, 3, 4, 5, 6, 7, 8]
  indices = [[4], [3], [1], [7]]
  updates = [9, 10, 11, 12]
  output  = [1, 11, 3, 10, 9, 6, 7, 12]

示例 2

  data    = [[[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]
  indices = [[0], [2]]
  updates = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
             [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]]
  output  = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
             [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]

输入

  • data (异构) - T

    秩为 r >= 1 的张量。

  • indices (异构) - tensor(int64)

    秩为 q >= 1 的张量。

  • updates (异构) - T

    秩为 q + r - indices_shape[-1] - 1 的张量。

输出

  • output (异构) - T

    秩为 r >= 1 的张量。

类型约束

  • T in ( tensor(bfloat16), tensor(bool), tensor(complex128), tensor(complex64), tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(string), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8) )

    将输入和输出类型约束为任何张量类型。

ScatterND - 11

版本

  • 名称: ScatterND (GitHub)

  • : main

  • since_version: 11

  • 函数: False

  • 支持级别: SupportType.COMMON

  • 形状推断: True

此版本的运算符已从版本 11开始可用。

概要

ScatterND 接受三个输入:data 张量,秩为 r >= 1;indices 张量,秩为 q >= 1;以及 updates 张量,秩为 q + r - indices.shape[-1] - 1。该运算的输出通过创建输入 data 的副本,然后将其值更新为 updates 指定的值,这些值位于由 indices 指定的特定索引位置。其输出形状与 data 的形状相同。请注意,indices 不应该具有重复的条目。也就是说,不支持对同一索引位置进行两次或多次 updates

indices 是一个整数张量。设 k 表示 indices.shape[-1],即 indices 形状中的最后一个维度。indices 被视为 (q-1) 维度的 k 元组张量,其中每个 k 元组是 data 的部分索引。因此,k 的值最大可以是 data 的秩。当 k 等于 rank(data) 时,每个更新条目指定对张量的单个元素进行更新。当 k 小于 rank(data) 时,每个更新条目指定对张量的切片进行更新。索引值允许为负数,与从末尾反向计数的常用约定一致,但预期在有效范围内。

updates 被视为 (q-1) 维度的替换切片值张量。因此,updates.shape 的前 (q-1) 个维度必须与 indices.shape 的前 (q-1) 个维度匹配。updates 的其余维度对应于替换切片值。每个替换切片值是 (r-k) 维度的张量,对应于 data 的尾随 (r-k) 维度。因此,updates 的形状必须等于 indices.shape[0:q-1] ++ data.shape[k:r-1],其中 ++ 表示形状的串联。

output 通过以下等式计算

output = np.copy(data)
update_indices = indices.shape[:-1]
for idx in np.ndindex(update_indices):
    output[indices[idx]] = updates[idx]

上述循环中迭代的顺序未指定。特别是,索引不应具有重复的条目:也就是说,如果 idx1 != idx2,则 indices[idx1] != indices[idx2]。这确保了输出值不依赖于迭代顺序。

此运算符是 GatherND 的逆运算。

示例 1

  data    = [1, 2, 3, 4, 5, 6, 7, 8]
  indices = [[4], [3], [1], [7]]
  updates = [9, 10, 11, 12]
  output  = [1, 11, 3, 10, 9, 6, 7, 12]

示例 2

  data    = [[[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]
  indices = [[0], [2]]
  updates = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
             [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]]
  output  = [[[5, 5, 5, 5], [6, 6, 6, 6], [7, 7, 7, 7], [8, 8, 8, 8]],
             [[1, 2, 3, 4], [5, 6, 7, 8], [8, 7, 6, 5], [4, 3, 2, 1]],
             [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]],
             [[8, 7, 6, 5], [4, 3, 2, 1], [1, 2, 3, 4], [5, 6, 7, 8]]]

输入

  • data (异构) - T

    秩为 r >= 1 的张量。

  • indices (异构) - tensor(int64)

    秩为 q >= 1 的张量。

  • updates (异构) - T

    秩为 q + r - indices_shape[-1] - 1 的张量。

输出

  • output (异构) - T

    秩为 r >= 1 的张量。

类型约束

  • T 在 ( tensor(bool), tensor(complex128), tensor(complex64), tensor(double), tensor(float), tensor(float16), tensor(int16), tensor(int32), tensor(int64), tensor(int8), tensor(string), tensor(uint16), tensor(uint32), tensor(uint64), tensor(uint8) ) 中

    将输入和输出类型约束为任何张量类型。