numpy比较数组整体

时间:2015-02-04 02:13:02

标签: python arrays numpy

我有一个数组x=np.array([[0,1,2,],[0,0,0],[3,4,0],[1,2,3]]),我希望得到x = [0,0,0]的索引,即1.我尝试np.where(x==[0,0,0])得到(array([0, 1, 1, 1, 2]), array([0, 0, 1, 2, 2]))。我怎样才能得到想要的答案?

3 个答案:

答案 0 :(得分:4)

作为@transcranial解决方案,您可以使用np.all()来完成这项工作。但np.all()速度很慢,因此如果将其应用于大型阵列,速度将是您的关注点。

要测试特定值或特定范围,我会这样做。

x = np.array([[0,1,2],[0,0,0],[3,4,0],[1,2,3],[0,0,0]])

condition = (x[:,0]==0) & (x[:,1]==0) & (x[:,2]==0)
np.where(condition)
# (array([1, 4]),)

它有点难看,但几乎是np.all()解决方案的两倍。

In[23]: %timeit np.where(np.all(x == [0,0,0], axis=1) == True)
100000 loops, best of 3: 6.5 µs per loop
In[22]: %timeit np.where((x[:,0]==0)&(x[:,1]==0)&(x[:,2]==0))
100000 loops, best of 3: 3.57 µs per loop

你不仅可以测试平等,还可以测试范围。

condition = (x[:,0]<3) & (x[:,1]>=1) & (x[:,2]>=0)
np.where(condition)
# (array([0, 3]),)

答案 1 :(得分:1)

可能有点贵 x.tolist().index([0,0,0]) 应该工作

要适应所有匹配的索引而不是一个,请使用

xL = x.tolist()
indices = [i for i, x in enumerate(xL) if x == [0,0,0]]

(灵感来自this answer

答案 2 :(得分:0)

import numpy as np
x = np.array([[0,1,2],[0,0,0],[3,4,0],[1,2,3]])
np.where(np.all(x == [0,0,0], axis=1) == True)[0].tolist()
# outputs [1]

np.all测试axis=1上所有元素的相等性,在这种情况下输出array([False, True, False, False])。然后使用np.where获取指向此位置的索引。