用PyTorch中的张量索引多维张量

用PyTorch中的张量索引多维张量,pytorch,tensor,Pytorch,Tensor,我有以下代码: a = torch.randint(0,10,[3,3,3,3]) b = torch.LongTensor([1,1,1,1]) 我有一个多维索引b,想用它在a中选择一个单元格。如果b不是张量,我可以: a[1,1,1,1] 返回正确的单元格,但: a[b] 不起作用,因为它只选择了a[1]四次 我该怎么做?谢谢您可以使用将b拆分为4,然后使用分块的b为所需的特定元素编制索引: >> a = torch.arange(3*3*3*3).view(3,3,3,3

我有以下代码:

a = torch.randint(0,10,[3,3,3,3])
b = torch.LongTensor([1,1,1,1])
我有一个多维索引
b
,想用它在
a
中选择一个单元格。如果b不是张量,我可以:

a[1,1,1,1]
返回正确的单元格,但:

a[b]
不起作用,因为它只选择了
a[1]
四次


我该怎么做?谢谢

您可以使用将
b
拆分为4,然后使用分块的
b
为所需的特定元素编制索引:

>> a = torch.arange(3*3*3*3).view(3,3,3,3)
>> b = torch.LongTensor([[1,1,1,1], [2,2,2,2], [0, 0, 0, 0]]).t()
>> a[b.chunk(chunks=4, dim=0)]   # here's the trick!
Out[24]: tensor([[40, 80,  0]])
它的优点在于,它可以很容易地推广到
a
的任何维度,您只需使卡盘的数量等于
a
的维度,一个更优雅(更简单)的解决方案可能是将
b
转换为元组:

a[tuple(b)]
Out[10]: tensor(5.)

我很好奇这是如何与“常规”numpy一起工作的,并找到了一篇相关文章对此进行了很好的解释。

增加了能够同时使用多个索引的好处,而我在问题中没有说明这一点。测试了这一点,它的工作,虽然值得注意的是,我需要压缩输出。谢谢@Chum ChumScarecrows感谢您的接受,但AFAIK也推广到多个指数。我想你应该接受他的观点。有没有办法让这个解决方案与索引列表一起工作?结果是
a[list(b)]
也能工作。有趣。或者你指的是“列表中的元素列表”(即类似于
b=[[1,1,1,1],[1,1,2],[2,3,1,2]
?嗯……我们可以不将索引张量转换为元组就这样做吗?(假设它很大,驻留在GPU上,制作一个元组会将所有值拉到CPU上,这既增加了开销,又迫使GPU在CPU上等待,反之亦然)。我已经有一段时间没有使用它了,所以我无法自信地回答您的问题。我的直觉告诉我,这是不可能的,您将不得不移动数据。不过,我很高兴被证明是错误的,所以这可能是一个单独的问题?