问题
我有一个索引列表和一个值列表,如下所示:
i = torch.tensor([[2, 2, 1], [2, 0, 2]])
v = torch.tensor([1, 2, 3])
我想定义一个(示例中的3x3
)矩阵,其中包含索引i
处的值v
(1
位于 (2,2)
位置,2
位于 (2, 0)
和 3
位置在位置(1,2)
):
tensor([[0, 0, 0],
[0, 0, 3],
[2, 0, 1]])
我尝试过的
我可以使用 torch.sparse
和 .to_dense()
使用技巧来做到这一点,但我觉得这不是“pytorchic”方式来做到这一点,也不是最有效:
f = torch.sparse.FloatTensor(indices, values, torch.Size([3, 3]))
print(f.to_dense())
有更好的解决方案吗?
理想情况下,我希望有一种至少与上面提供的解决方案一样快的解决方案。
当然,这只是一个示例,张量 i
和 v
中没有假设任何特定结构(维度都没有)。
最佳答案
还有一个替代方案,如下所示:
import torch
i = torch.tensor([[2, 2, 1], [2, 0, 2]])
v = torch.tensor([1, 2, 3], dtype=torch.float) # enforcing same data-type
target = torch.zeros([3,3], dtype=torch.float) # enforcing same data-type
target.index_put_(tuple([k for k in i]), v)
print(target)
目标
张量如下:
tensor([[0., 0., 0.],
[0., 0., 3.],
[2., 0., 1.]])
This medium.com blog article提供 PyTorch 张量的所有索引函数的完整列表。
关于python-3.x - 使用 Pytorch 如何定义带有索引和相应值的张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66103930/