请考虑以下列表:
[[3], [1, 2], [4], [0], [2]]
和大小为(5, 5)
的零张量
我想根据索引在张量中的索引将它们填充为1。
因此,预期输出应为:
tensor([[0., 0., 0., 1., 0.],
[0., 1., 1., 0., 0.],
[0., 0., 0., 0., 1.],
[1., 0., 0., 0., 0.],
[0., 0., 1., 0., 0.]])
上面发生的事情是
在索引[0, 3]
处放置1
(我列表中第一个元素的情况)。
使用Tensor.scatter_
可以实现非常相似的情况。但是,由于它采用张量作为参数(index
);如果列表中包含的子列表的大小不同于其他元素,则无法从列表中创建张量,在我的列表中,[1, 2]
就是这种情况(这实际上是问题所在)。
如果列表的大小都与以下大小相同,则可以使用scatter
方法:
tensor.scatter_(1, torch.tensor(index), 1)
可以接受大量的解决方案
答案 0 :(得分:1)
您可以通过修改索引列表以使每个元素中的索引数相同来解决此问题。
max_length = max([len(l) for l in index])
index = [l + l[-1:] * (max_length - len(l)) for l in index]
此代码将重复每个子列表的最后一个元素,直到它们大小相同为止。然后,您可以按照问题中的说明将其传递给scatter_
函数。