将新值分配给特定索引处的张量

时间:2020-02-24 09:07:33

标签: python pytorch

这是一个简单的示例。

假设我有一个输入张量M。现在我有一个M的索引张量,其大小为2 x 3,例如[[0, 1], [2,2], [0,1]],并且与索引张量对应的新值数组为{{1 }}。我想将这些值分配给输入M,以满足在索引[1, 2, 3]处将M的元素分配为最小值的情况(在此示例中为1)。

它表示[0,1]M[0,1] = 1

我可以通过使用Pytorch中的一些可用功能来实现此功能吗?

1 个答案:

答案 0 :(得分:1)

可以不带循环地完成,但是由于运行时间显着增加,我通常不确定这是否是个好主意。

基本思想相对简单:由于张量分配总是分配最后一个元素,因此根据存储在值列表中的各个值以M降序对元组进行排序就足够了(我们称之为v

要在pytorch中执行此操作,让我们考虑以下示例:

import torch as t
X = t.randn([3, 3])  # Random matrix of size 3x3
v = t.tensor([1, 2, 3])
M = t.tensor([[0, 2, 0],
              [1, 2, 1]])  # accessing the elements described above

# Showcase pytorch's result with "naive" tensor assignment:
X[tuple(M)] = v  # This would assign the value 3 to position (0, 1)

# To correct behavior, sort v in decreasing order.
v_desc = v.sort(decreasing=True)
# v now contains both the values and the indices of original position
print(v_desc)
# torch.return_types.sort(
#       values=tensor([3, 2, 1]),
#       indices=tensor([2, 1, 0]))


# Access M in the correct order:
M_desc = M[:, v_desc.indices]

# Finally assign correct order:
X[tuple(M_desc)] = v_desc
同样,这相对复杂,因为它涉及对值进行排序以及对张量进行“重新混洗”。如果就地执行操作,则肯定可以节省至少一些内存,出于清晰起见,我不考虑这样做。

作为一个答案,是否也可以不进行排序而实现,我相当确定答案将是“否”。张量分配只能在相当简单的条件下进行,而不能在像相互依赖的条件那样更复杂的条件下进行。