2014-02-17 211 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