2014-02-17 160 views
1

我怎样才能只匹配测试所有的数组元素?例如在该数组的元素,如果我有:只获取匹配测试数组所有元素的数组元素?

>>> import numpy as np 

>>> arr = np.array([[0, 0, 1], [1, 0, 1], [1, 0, 1]]) 
>>> arr == [0,0,1] 
array([[ True, True, True], 
    [False, True, True], 
    [False, True, True]], dtype=bool) 

arr == [0,0,1]的解决方案是该指数0

回答

2

你需要按行使用axis参数来检查条件:

>>> (arr == np.array([0,0,1])).all(axis=1) 
array([ True, False, False], dtype=bool) 

如果你想索引:

>>> np.where((arr == np.array([0,0,1])).all(axis=1)) 
(array([0]),) 

我们可以也做一些整洁(和快速),以防止从np.all呼叫np.reduce

>>> b = np.array([0,0,1]) 
>>> dt = np.dtype((np.void, arr.dtype.itemsize * arr.shape[1])) 
>>> (arr.view(dt) == b.view(dt)).reshape(-1) 
array([ True, False, False], dtype=bool) 

一些定时:

arr = np.random.randint(0,2,(1E2,3)) 

%timeit (arr.view(dt) == b.view(dt)).reshape(-1) 
100000 loops, best of 3: 7.76 µs per loop 
%timeit (arr == b).all(axis=1) 
100000 loops, best of 3: 13.5 µs per loop 

对于较大的阵列:

arr = np.random.randint(0,2,(1E5,3)) 

%timeit (arr.view(dt) == b.view(dt)).reshape(-1) 
1 loops, best of 3: 221 ms per loop  
%timeit (arr == b)).all(axis=1) 
1 loops, best of 3: 315 ms per loop 
0

试试这个:

print arr[np.all((arr == [0,0,1]),axis=1)] 

或者:

print np.arange(arr.shape[0])[np.all((arr == [0,0,1]),axis=1)] 

如果你想要的答案的只是指数

+0

这仅适用的,因为它的计算结果为假,因此0索引。 'arr [(arr == [1,0,1])。all()]'仍然给出相同的结果。 – M4rtini

+0

哦!...,是我的错,应该使用'np.all',谢谢 –

+0

'.all'和'np.all'是相同的功能。问题不在于定义轴。 – M4rtini