NumPy数组上项目的坐标

23

我有一个NumPy数组:

[[  0.   1.   2.   3.   4.]
 [  7.   8.   9.  10.   4.]
 [ 14.  15.  16.  17.   4.]
 [  1.  20.  21.  22.  23.]
 [ 27.  28.   1.  20.  29.]]

我希望快速找到特定值的坐标而避免在数组上使用Python循环。例如数字4在:

row 0 and col 4
row 1 and col 4
row 2 and col 4

搜索功能应返回一个元组:

((0,4),(1,4),(2,4))

能否直接使用NumPy函数完成此操作?

2个回答

30

如果a是你的数组,那么你可以使用:

ii = np.nonzero(a == 4)
或者
ii = np.where(a == 4)
如果你真的想要一个元组,你可以将数组的元组转换为元组的元组。但是,numpy函数返回的值更方便进行其他数组操作。
针对原作者的规格,转换为元组如下:
tuple(zip(*ii))

24
a = numpy.array([[  0.,  1.,  2.,  3.,  4.],
                 [  7.,  8.,  9., 10.,  4.],
                 [ 14., 15., 16., 17.,  4.],
                 [  1., 20., 21., 22., 23.],
                 [ 27., 28.,  1., 20., 29.]])
print numpy.argwhere(a == 4.)

打印

[[0 4]
 [1 4]
 [2 4]]

浮点数比较的常规警告适用。


1
从文档中可以看到,"np.argwhere的输出不适合用于索引数组。为此,请使用np.where(a)。" - JoshAdel
@JoshAdel:你认为OP为什么想要用这个来进行索引?我选择了一个能够产生最接近OP所需输出的函数。 - Sven Marnach
@SvenMarnach:可以两个一起用,他只是先提到了 .where - Ηλίας
@SvenMarnach:别难过,你在我这里还有17k的声望分数 :-) 但说真的,我也提供了一种方法来获得OP所需的输出,但我也想指出一些关于numpy工作方式的东西,可能对其他人有用。这并不是要打击你的解决方案,而是一些额外的(我认为很有用的)信息。 - JoshAdel
@SvenMarnach,@JoshAdel 这也是一个并发问题的一部分,我认为如果 Google Wave 取得成功,SO 也会受益! - Ηλίας
@JoshAdel:我认为你的评论很有帮助。我的观点只是,如果没有必要,我会尽量不对提问者的目标做出假设。 - Sven Marnach

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