我是一个粒子模拟器的爱好者,想要使用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:任何一个都起作用了,它比我想象中更有逻辑意义,谢谢!
Ctrl+K
(或code
工具栏按钮)将其格式化为代码。 - voithos