Python/Numpy中数组在另一个数组中的索引

4

我是一个粒子模拟器的爱好者,想要使用Python和NumPy结合Matplotlib尽可能高效地制作出最逼真的模拟器(这只是一种有趣的Python练习)。但是在计算距离的倒数时遇到了问题。

我有一个包含粒子位置(x,y)的数组:

x = random.randint(0,3,10).reshape(5,2)
>>> x
array([[1, 1],
   [2, 1],
   [2, 2],
   [1, 2],
   [0, 1]])

这是5个粒子,它们的位置(x,y)在[0,3]之间。现在,如果我想要计算一个粒子(比如具有位置(0,1)的粒子)与其他粒子之间的距离,我可以这样做:
>>>x - [0,1]
array([[1, 0],
   [2, 0],
   [2, 1],
   [1, 1],
   [0, 0]])

问题在于我不想计算粒子到自身 (0,0) 的距离。它的长度为0,倒数为无限大,在引力或库仑力中没有定义。
所以我尝试了:where(x==[0,1])
>>>where(x==[0,1])
(array([0, 1, 4, 4]), array([1, 1, 0, 1]))

这不是(0,1)粒子在x数组中的位置。那么,我如何从像x这样的数组中选择[0,1]的位置?上面的where()检查x等于0或1的位置,而不是x等于[0,1]的位置。如何在不循环的情况下使用“numpylike”来实现这一点?
附:怎么用复制-粘贴将代码插入stackoverflow?坏论坛有一个[code]..[/code]选项,而在这里我花了15分钟适当地缩进代码(因为chromium在ubuntu上的tab键不会缩进4个空格,而是跳出窗口……)这非常烦人。
编辑:看到第一个答案后,我尝试了:
x
array([[0, 2],
       [2, 2],
       [1, 0],
       [2, 2],
       [1, 1]])
>>> all(x==[1,1],axis=1)
array([False, False, False, False,  True], dtype=bool)
>>> all(x!=[1,1], axis=1)
array([ True,  True, False,  True, False], dtype=bool)

这不是我所希望的,!= 应该返回不包含 [1,1] 的数组。但是它错过了一个 (1,0):

>>>x[all(x!=[1,1], axis=1)]
array([[0, 2],
       [2, 2],
       [2, 2]])

编辑2:任何一个都起作用了,它比我想象中更有逻辑意义,谢谢!


4
只需将其复制并粘贴,选择代码,然后按 Ctrl+K(或 code 工具栏按钮)将其格式化为代码。 - voithos
1个回答

5
>>> import numpy as np
>>> x=np.array([[1, 1],
...    [2, 1],
...    [2, 2],
...    [1, 2],
...    [0, 1]])
>>> np.all(x==[0,1], axis=1)
array([False, False, False, False,  True], dtype=bool)
>>> np.where(np.all(x==[0,1], axis=1))
(array([4]),)
>>> np.where(np.any(x!=[0,1], axis=1))
(array([0, 1, 2, 3]),)

啊,谢谢,我曾认为我已经掌握了numpy索引的圣杯,然后我执行了x!= [a,b],但结果并非我所期望的。请参见上面的编辑。 - arynaq
@user948652 在使用 != 时请使用 any 而不是 all。已编辑回答。 - Janne Karila

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