Python 使用numpy.argwhere获取np.array中的匹配值

Python 使用numpy.argwhere获取np.array中的匹配值,python,numpy,Python,Numpy,我想使用np.argwhere()获取np.array中的值 例如: z = np.arange(9).reshape(3,3) [[0 1 2] [3 4 5] [6 7 8]] zi = np.argwhere(z % 3 == 0) [[0 0] [1 0] [2 0]] 我想要这个数组:[0,3,6],并执行了以下操作: t=[z[tuple(i)]表示zi中的i]#->[0,3,6] 我想有一个更简单的方法 为什么不在这里简单地使用掩蔽: z[z % 3 == 0] 如

我想使用
np.argwhere()
获取
np.array
中的值

例如:

z = np.arange(9).reshape(3,3)

[[0 1 2]
 [3 4 5]
 [6 7 8]]

zi = np.argwhere(z % 3 == 0)

[[0 0]
 [1 0]
 [2 0]]
我想要这个数组:
[0,3,6]
,并执行了以下操作:

t=[z[tuple(i)]表示zi中的i]#->[0,3,6]


我想有一个更简单的方法

为什么不在这里简单地使用掩蔽:

z[z % 3 == 0]
如果传递一个具有相同维度的矩阵,并将布尔值作为索引,则会得到一个包含该矩阵元素的数组,其中布尔矩阵为
True


这将进一步提高工作效率,因为您在numpy级别进行过滤(而列表理解在Python解释器级别工作)。

源代码for
argwhere

def argwhere(a):
    """
    Find the indices of array elements that are non-zero, grouped by element.
    ...
    """
    return transpose(nonzero(a))
np.其中
np.非零
相同

In [902]: z=np.arange(9).reshape(3,3)
In [903]: z%3==0
Out[903]: 
array([[ True, False, False],
       [ True, False, False],
       [ True, False, False]], dtype=bool)
In [904]: np.nonzero(z%3==0)
Out[904]: (array([0, 1, 2], dtype=int32), array([0, 0, 0], dtype=int32))
In [905]: np.transpose(np.nonzero(z%3==0))
Out[905]: 
array([[0, 0],
       [1, 0],
       [2, 0]], dtype=int32)

In [906]: z[[0,1,2], [0,0,0]]
Out[906]: array([0, 3, 6])
z[np.nonzero(z%3==0)]
相当于使用
I,J
作为索引数组:

In [907]: I,J =np.nonzero(z%3==0)
In [908]: I
Out[908]: array([0, 1, 2], dtype=int32)
In [909]: J
Out[909]: array([0, 0, 0], dtype=int32)
In [910]: z[I,J]
Out[910]: array([0, 3, 6])

试试:
z[tuple(zi.T)]
zi=np。其中(…)
可以直接使用
T=z[zi]
。这是索引数组的元组
arg,其中
是它的转置。比较他们的产出。谢谢。我仍然习惯于numpy数组的索引方式,所以这对我来说并不明显。numpy操作更快,因此对于大型数据集,np是首选。这太棒了。非常感谢。
In [907]: I,J =np.nonzero(z%3==0)
In [908]: I
Out[908]: array([0, 1, 2], dtype=int32)
In [909]: J
Out[909]: array([0, 0, 0], dtype=int32)
In [910]: z[I,J]
Out[910]: array([0, 3, 6])