将均匀分布的值散列到PyTorch张量中

3

考虑以下列表:

[[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)

可以使用Numpy解决方案


使用NumPy是合理的吗? - Salih Karagoz
当然,非常合理。 - ndrwnaguib
让我试一下。 - Salih Karagoz
1个回答

1
你可以通过修改索引列表,使每个元素具有相同数量的索引来解决这个问题。
max_length = max([len(l) for l in index])
index = [l + l[-1:] * (max_length - len(l)) for l in index]

这段代码会重复每个子列表的最后一个元素,直到它们的长度相同。然后,您可以像在问题中编写的那样将其传递给scatter_函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接