让我们
a = tensor([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
b = torch.tensor([1, 2])
c = tensor([[1, 2, 0, 0],
[0, 1, 2, 0],
[0, 0, 1, 2]])
是否有一种方法可以通过将c
分配给b
的切片而没有任何循环来获取a
?也就是说,a[indices] = b
代表某些indices
还是类似的东西?
答案 0 :(得分:3)
您可以在pytorch中使用scatter
方法。
a = torch.tensor([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])
b = torch.tensor([1, 2])
index = torch.tensor([[0,1],[1,2],[2,3]])
a.scatter_(1, index, b.view(-1,2).repeat(3,1))
# tensor([[1, 2, 0, 0],
# [0, 1, 2, 0],
# [0, 0, 1, 2]])
答案 1 :(得分:2)
该操作背后的逻辑有些不确定,因为尚不清楚该操作的参数是什么。 但是,仅通过矢量化操作从输入中获得所需输出的一种方法是:
3
)a
,以使b
后跟零个数作为行数(2 + 3
)和选定的行数({{ 1}})3
分配到b
的开头a
切成零,并调整为目标形状。在NumPy中,可以实现为:
num_rows
在Torch中实现的相同方法:
import numpy as np
b = np.array([1, 2])
c = np.array([[1, 2, 0, 0],
[0, 1, 2, 0],
[0, 0, 1, 2]])
num_rows = 3
a = np.zeros((num_rows, len(b) + num_rows), dtype=b.dtype)
a[:, :len(b)] = b
a = a.ravel()[:-num_rows].reshape((num_rows, len(b) + num_rows - 1))
print(a)
# [[1 2 0 0]
# [0 1 2 0]
# [0 0 1 2]]
print(np.all(a == c))
# True