这是一个简单的示例。
假设我有一个输入张量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中的一些可用功能来实现此功能吗?
答案 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
同样,这相对复杂,因为它涉及对值进行排序以及对张量进行“重新混洗”。如果就地执行操作,则肯定可以节省至少一些内存,出于清晰起见,我不考虑这样做。
作为一个答案,是否也可以不进行排序而实现,我相当确定答案将是“否”。张量分配只能在相当简单的条件下进行,而不能在像相互依赖的条件那样更复杂的条件下进行。