torch.Tensor.scatter_add_¶
- Tensor.scatter_add_(dim, index, src) Tensor ¶
将张量
src
中的所有值按index
张量中指定的索引添加到self
中,类似于scatter_()
。对于src
中的每个值,它被添加到由src
中的索引指定的self
中的索引,以及由index
中的对应值指定的dimension != dim
中的索引。对于一个三维张量,
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
self
、index
和src
应具有相同的维度。还要求对于所有维度d
的index.size(d) <= src.size(d)
,以及对于所有维度d != dim
的index.size(d) <= self.size(d)
。注意,index
和src
不能进行广播。注意
当在 CUDA 设备上给定张量时,此操作可能表现出非确定性。有关更多信息,请参阅可重现性。
注意
仅实现了
src.shape == index.shape
的反向传播。- 参数:
dim(整数)- 指索引的轴
索引(LongTensor)- 要分散和添加的元素的索引,可以是空的,也可以与
src
的维度相同。当为空时,该操作返回self
不变。源(张量)- 要散列并添加的源元素
示例:
>>> 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.]])