2014-06-16 56 views
3

讓我們說,我給你以下布爾數組:numpy的logical_and:意外的行爲

b1 = np.array([ True, True, False, True ]) 
b2 = np.array([ True, False, False, True ]) 
b3 = np.array([ True, True, True, False ]) 

如果AND在一起,你會想到以下結果:

b4 = np.array([ True, False, False, False ]) 

,對嗎?如果沒有,請解釋。如果我們同意,那麼爲什麼會發生以下情況?

>>> np.logical_and(b1, b2, b3) 
array([ True, False, False, True ]) 

np.logical_and(np.logical_and(b1, b2), b3)確實給出了預期的結果。

回答

11

看那documentation of np.logical_and。像大多數NumPy運算符函數一樣,第三個參數是out參數,用於指定目標數組。它是不是一個操作數!把b3只會覆蓋b3的內容。

使用&是在大多數情況下,更清晰,更簡單:

b4 = b1 & b2 & b3 
+3

這是無關緊要時,如OP的情況下,數組已經是布爾型的,但'&'調用'bitwise_and',而不是'logical_and'。 – Jaime

5

的第三個參數是np.logical_and可選out參數,其存儲操作的結果。

也就是說,撥打np.logical_and(b1, b2, b3)覆蓋b3np.logical_and(b1, b2)的結果。

輸出參數是determining output type和一般效率是有用的。

1

logical_and()是一個二元運算符,你的問題,你可以使用:

np.all([b1, b2, b3], axis=0) 
np.logical_and.reduce([b1, b2, b3], axis=0) 
+0

哪一個最高效? – user89