【问题标题】:Python/Numpy index of array in array数组中数组的 Python/Numpy 索引
【发布时间】: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工具栏按钮)将其格式化为代码。

标签: python numpy


【解决方案1】:
>>> 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]),)

【讨论】:

  • 啊,谢谢,现在我认为我可以访问 numpy 索引的圣杯并且做了 x!=[a,b] 并且没有得到我期望的结果。请参阅上面的编辑。
  • @user948652 使用any 而不是all!=。编辑答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2021-11-17
  • 2012-07-14
  • 2018-07-10
  • 1970-01-01
相关资源
最近更新 更多