4

我只是在玩粒子模拟器,我想将 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]])

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

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

问题是我不想将粒子与自身的距离:(0,0)。它的长度为 0,倒数是无限的,并且没有为重力或 coloumb 力定义。

所以我尝试了: 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”?

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

Edit2:任何成功的伎俩,它比我想象的更合乎逻辑,谢谢!

4

1 回答 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]),)
于 2012-11-22T19:10:04.100 回答