2011-12-25 318 views
36

例如執行單元方式布爾運算,我想創建一個面具掩蓋與價值元素40和60之間:如何在numpy的陣列

foo = np.asanyarray(range(100)) 
mask = (foo < 40).__or__(foo > 60) 

剛剛長得難看,我不能寫:

(foo < 40) or (foo > 60) 

,因爲我結束了:

ValueError Traceback (most recent call last) 
    ... 
    ----> 1 (foo < 40) or (foo > 60) 
    ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

是否有這樣做元素方式布爾OPE的規範的方法具有良好代碼的numpy數組上的口糧?

回答

55

你試過嗎?

mask = (foo < 40) | (foo > 60) 

注意:在一個對象中的方法__or__重載按位或運算符(|),而不是布爾or運算符。

+1

哦真的是愚蠢的我。當然,它的工作原理:) – 2011-12-25 23:11:24

+0

它不起作用:TypeError:輸入類型不支持ufunc'bitwise_or',並且輸入不能安全地強制轉換爲任何支持的類型根據轉換規則''safe'' – Mehdi 2015-07-24 12:41:50

+4

Don忘了把你的表情正確地包圍起來 – gota 2016-07-18 16:04:18

13

如果您僅在布爾值範圍內進行比較(如您的示例中所示),則可以按照Jcollado的建議使用按位或運算符|。但要小心,如果您使用非布爾值,如mask = (foo < 40) | override,這會給您帶來奇怪的結果。只要override保證爲False,True,1或0,你沒事。

更一般的是使用numpy的比較集操作符np.anynp.all。這段代碼返回35和45之間的所有值,其小於40或不是3的倍數:

import numpy as np 
foo = np.arange(35, 46) 
mask = np.any([(foo < 40), (foo % 3)], axis=0) 
print foo[mask] 
OUTPUT: array([35, 36, 37, 38, 39, 40, 41, 43, 44]) 

不是像你一樣有|,但比你的問題的代碼更好。

+0

這是一個值得指出的問題! – 2012-06-28 15:36:41

+0

專門使用'np.any'和'np.all'是個好主意。 – htredleaf 2015-10-26 07:17:24

1

請注意,您可以使用~進行元素否定。

arr = np.array([False, True]) 
~arr 

OUTPUT: array([ True, False], dtype=bool) 

而且&不按元素

arr_1 = np.array([False, False, True, True]) 
arr_2 = np.array([False, True, False, True]) 

arr_1 & arr_2 

OUTPUT: array([False, False, False, True], dtype=bool) 

這些工作也與熊貓系列

ser_1 = pd.Series([False, False, True, True]) 
ser_2 = pd.Series([False, True, False, True]) 

ser_1 & ser_2 

OUTPUT: 
0 False 
1 False 
2 False 
3  True 
dtype: bool 
+0

根據numpy文檔,它看起來像'&'做[_bitwise_和](https://docs.scipy.org/doc/numpy/reference/generated/numpy.bitwise_and.html#numpy.bitwise_and),而不是元素。 – HelloGoodbye 2016-10-24 16:36:30