将张量分配给多个切片

时间:2019-09-29 14:07:47

标签: python arrays pytorch slice tensor

让我们

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还是类似的东西?

2 个答案:

答案 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