2013-12-11 80 views
33

Numpy的logical_or函數不超過兩個數組進行比較。我怎樣才能找到兩個以上數組的聯合? (同樣的問題可能對於numpy的的logical_and並獲得兩個以上的陣列的交叉點被要求。)Numpy`logical_or`多於兩個參數

+3

['任何()'](http://docs.python.org/2/library/functions.html#any)? – karthikr

+2

你可能指的是['numpy.logical_or'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.logical_or.html)? –

+0

是的,這就是我正在使用的函數 – user3074893

回答

6

作爲布爾代數都是可交換和可結合根據定義,下面的語句或等效物的一個布爾值,b和c。

a or b or c

(a or b) or c

a or (b or c)

(b or a) or c

所以,如果你有一個 「邏輯或」,這是二進,你需要將它傳遞三個參數(A,B和C ),你可以撥打

logical_or(logical_or(a, b), c)

logical_or(a, logical_or(b, c))

logical_or(c, logical_or(b, a))

或置換任何你喜歡的。


回蟒蛇,如果你想測試一個條件(由函數test,需要一個被測定者和返回一個布爾值產生)是否適用於A或B或C或列表L的任何元素,通常使用

any(test(x) for x in L) 
+0

但是Python或者並不是真正的布爾型或者是因爲它適用於除bool之外的其他值(如果'a'是真的,則返回'a',否則''b'')電路(意思是'a或b'可以是真,而'b或a'則產生一個例外)。 – abarnert

+0

@abarnert謝謝,我編輯了我的答案來解釋這一點。 – Hyperboreus

+0

(我不確定爲什麼人們低估了這個,但是...... OP似乎是專門討論布爾值,他稱之爲「邏輯條件」。) – abarnert

87

如果你問numpy.logical_or,則沒有,因爲文檔明確地說,唯一的參數是x1, x2,以及可選out

numpy.logical_orx1, x2[, out])= <ufunc 'logical_or'>


您當然鏈在一起的多個logical_or呼叫這樣的:

>>> x = np.array([True, True, False, False]) 
>>> y = np.array([True, False, True, False]) 
>>> z = np.array([False, False, False, False]) 
>>> np.logical_or(np.logical_or(x, y), z) 
array([ True, True, True, False], dtype=bool) 

方式噸Ø推廣這種在NumPy的鏈接的是reduce

>>> np.logical_or.reduce((x, y, z)) 
array([ True, True, True, False], dtype=bool) 

,當然如果你有一個多維數組,而不是獨立的,這也將工作陣列 - 實際上,這就是它的意味着是使用:

>>> xyz = np.array((x, y, z)) 
>>> xyz 
array([[ True, True, False, False], 
     [ True, False, True, False], 
     [False, False, False, False]], dtype=bool) 
>>> np.logical_or.reduce(xyz) 
array([ True, True, True, False], dtype=bool) 

但是三個相等長度的一維數組的元組是array_like在NumPy的術語,並且可被用作一個二維數組。


外NumPy的,你也可以使用Python reduce

>>> functools.reduce(np.logical_or, (x, y, z)) 
array([ True, True, True, False], dtype=bool) 

然而,不同於與NumPy的reduce,是不是經常需要Python的。對於大多數情況,有一種更簡單的方式來做事情 - 例如,將多個Python or運算符鏈接在一起,而不是reduce,而不是operator.or_,只需使用any即可。當不是時,使用顯式循環通常更具可讀性。

事實上NumPy的any也可以用於這種情況,雖然它不是很平常;如果你沒有明確地給它一個軸,你最終會得到一個標量而不是一個數組。所以:

>>> np.any((x, y, z), axis=0) 
array([ True, True, True, False], dtype=bool) 

如你所料,logical_and類似,您可以鏈接它,它np.reducefunctools.reduce它,或者以顯式axis替代all

其他操作如logical_xor?再一次,同樣的交易......除了在這種情況下,沒有適用的all/any-類型的函數。 (你會怎麼稱呼它odd?)

-1

大廈abarnert的回答爲n維案例:

TL; DR:np.logical_or.reduce(np.array(list))

3

如果有人仍然需要這一點 - 假設你有三個布爾數組abc具有相同形狀,這給and逐元素:

a * b * c 

這給出or

a + b + c 

這是你想要的嗎? 堆積很多logical_andlogical_or是不實際的。使用總和函數

+0

良好的解決方法,但numpy.mupltiply僅適用於2個數組 – Alex

1

a = np.array([True, False, True]) 
b = array([ False, False, True]) 
c = np.vstack([a,b,b]) 

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

np.sum(c,axis=0)>0 
Out[173]: array([ True, False, True], dtype=bool)