将元组/数组/列表作为Numpy数组的索引进行解包

31

我很想能够做到这件事

>>> A = numpy.array(((1,2),(3,4)))
>>> idx = (0,0)
>>> A[*idx]

并获取

1

然而,这不是有效的语法。是否有一种方法可以在不显式编写的情况下完成这个任务?

>>> A[idx[0], idx[1]]

编辑:感谢回答。在我的程序中,我使用了一个Numpy数组进行索引,而不是元组,导致出现奇怪的结果。按照Alok的建议转换为元组就解决了问题。


这是一个艰难的决定。最终我认为 Vicki 比你更需要这些积分。不过我还是给了你一个赞 :-) - ntimes
此外,我想Vicki的回答说明了我可以直接使用示例元组。 - ntimes
4个回答

26

比你想象的更容易:

>>> import numpy
>>> A = numpy.array(((1,2),(3,4)))
>>> idx = (0,0)
>>> A[idx]
1

4
由于元组(tuples)和数组(arrays)之间的差异,才导致了这种情况。 - TRiNE

22

尝试

A[tuple(idx)]

除非你有一个比这个例子更复杂的用例,否则上述方法适用于所有数组。


2
@Mike:是的,但问题标题说它可能是列表或数组。 - Alok Singhal
也适用于Pytorch。 - Austin Garrett

6

无需拆包——当在[]之间有一个逗号时,你正在创建一个元组,而不是传递参数。 foo[bar, baz] 等同于 foo[(bar, baz)]。因此,如果你有一个元组 t = bar, baz,你只需要说 foo[t]


4

对一个对象进行索引调用:

object.__getitem__(index)

当您执行A [1, 2]时,它相当于:

A.__getitem__((1, 2))

因此,当您执行以下操作时:

b = (1, 2)

A[1, 2] == A[b]
A[1, 2] == A[(1, 2)]

这两个语句都将评估为True。

如果您使用列表进行索引,它可能不会索引相同,因为[1, 2]!=(1, 2)


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