torch.Tensor.scatter_add_

Tensor.scatter_add_(dim, index, src) Tensor

将张量 src 中的所有值以与 scatter_() 类似的方式添加到 selfindex 张量中指定的索引位置。对于 src 中的每个值,它会被加到由其在 src 中的索引和 dimension != dim 指定的位置上,或者由 index 张量中对应的值指定的位置上(当 dimension == dim 时)。

对于一个3D张量,self 将被更新为:

self[index[i][j][k]][j][k] += src[i][j][k]  # if dim == 0
self[i][index[i][j][k]][k] += src[i][j][k]  # if dim == 1
self[i][j][index[i][j][k]] += src[i][j][k]  # if dim == 2

selfindexsrc 应该具有相同的维度数量。此外,对于所有维度 d,需要满足 index.size(d) <= src.size(d),并且对于所有不等于 dim 的维度 d,需满足 index.size(d) <= self.size(d)。请注意,indexsrc 不进行广播。

注意

当张量位于CUDA设备上时,此操作可能表现出非确定性行为。更多详情请参阅重现性

注意

只有当src.shape == index.shape时,才实施反向传播。

参数
  • dim (int) - 需要进行索引的轴

  • index (LongTensor) – 要扩散和相加的元素索引,可以为空或与src具有相同的维度。如果为空,则操作将返回未改变的self

  • src (Tensor) – 需要散列和添加的源张量

示例:

>>> src = torch.ones((2, 5))
>>> index = torch.tensor([[0, 1, 2, 0, 0]])
>>> torch.zeros(3, 5, dtype=src.dtype).scatter_add_(0, index, src)
tensor([[1., 0., 0., 1., 1.],
        [0., 1., 0., 0., 0.],
        [0., 0., 1., 0., 0.]])
>>> index = torch.tensor([[0, 1, 2, 0, 0], [0, 1, 2, 2, 2]])
>>> torch.zeros(3, 5, dtype=src.dtype).scatter_add_(0, index, src)
tensor([[2., 0., 0., 1., 1.],
        [0., 2., 0., 0., 0.],
        [0., 0., 2., 1., 1.]])