我只是在玩粒子模拟器,我想将 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:任何成功的伎俩,它比我想象的更合乎逻辑,谢谢!