【发布时间】:2019-02-05 02:46:21
【问题描述】:
我有以下代码:
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]。
我该怎么做?谢谢
【问题讨论】:
我有以下代码:
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]。
我该怎么做?谢谢
【问题讨论】:
您可以使用chunk 将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 一起工作,并找到了一篇相关文章很好地解释了这一点 here。
【讨论】:
a[list(b)] 也有效。有趣的。还是您指的是“列表中的元素列表”(即,类似于b = [[1,1,1,1], [1,1,1,2], [2,3,1,2]]?