数组中的Python / Numpy数组索引

时间:2012-11-22 18:49:19

标签: python numpy

我正在玩一个粒子模拟器,我想使用matplotlib与python和numpy尽可能高效地制作尽可能逼真的模拟器(这纯粹是一个有趣的练习python)我有一个问题试图计算距离的倒数。

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

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

这是在[0,3]中具有位置(x,y)的5个粒子。现在,如果我想计算一个粒子(比如粒子与位置(0,1))和其余粒子之间的距离,我会做类似的事情

>>>x - [0,1]
array([[1, 0],
   [2, 0],
   [2, 1],
   [1, 1],
   [0, 0]])

问题是我不想将粒子的距离带到自身:(0,0)。这具有长度0并且倒数是无穷大的并且没有针对重力或coloumb力定义。

所以我试过了: 其中(x == [0,1])

>>>where(x==[0,1])
(array([0, 1, 4, 4]), array([1, 1, 0, 1]))

这不是x数组中(0,1)粒子的位置。那么如何从像x这样的数组中选出[0,1]的位置呢?上面的where()检查x等于0或1的位置,而不是x等于[0,1]的位置。如何在没有循环的情况下执行此“numpylike”?

Ps:如何将frack复制粘贴到stackoverflow?我的意思是坏论坛有一个[code] .. [/ code]选项,而在这里我花了15分钟正确缩进代码(因为在ubuntu上的chrome中的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)

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

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

Edit2 :任何诀窍,它比我想象的更具逻辑性,谢谢!

1 个答案:

答案 0 :(得分: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]),)