【发布时间】:2012-11-22 18:49:18
【问题描述】:
我只是在玩粒子模拟器,我想将 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 力定义。
所以我尝试了: 其中(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:你是如何将代码复制粘贴到 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:任何人都做到了,这比我想象的更合乎逻辑,谢谢!
【问题讨论】:
-
只需复制粘贴,选择代码,然后点击
Ctrl+K(或code工具栏按钮)将其格式化为代码。