2016-06-10 56 views
0

我到處搜索了一個答案,對不起,如果這是一個非常基本的問題。我使用布爾Numpy數組過濾Numpy數組,這是通過比較3個不同數組中相同索引的值創建的。對於所有指數i,我的比較都由2個獨立的布爾語句組成,例如x [i] == y [i] & x [i]!= z [i]。下面是令人不安的結果:Python 2.x在非常特殊的情況下,True和False返回True

x[8]=25 

y[8]=27 

z[8]=13 

x[8]==y[8] 

False 

x[8]!=z[8] 

True 

x[8]==y[8] & x[8]!=z[8] 

True 

正如你所看到的,上面假&真,則返回真。我錯過了什麼?正如我無奈的另一個例子,這裏是從正在返回正確的結果相同的陣列另一個例子:

x[3]=24 

y[3]=18 

z[3]=27 

x[3]==y[3] 

False 

x[3]!=z[3] 

True 

x[3]==y[3] & x[3]!=z[3] 

False 

正如你所看到的,這個例子能正常工作。任何幫助,將不勝感激。

謝謝!

回答

2

我錯過了什麼?

你缺少括號:

(x[8]==y[8]) & (x[8]!=z[8]) 

此外,你應該做這爲在整個陣列的矢量操作,而不是通過遍歷指數。希望你這樣做你真正的代碼,而你只是使用的特定指數在這裏讓這個例子更簡單:

(x == y) & (x != z) # Evaluates to an array of booleans. 

&是按位與運算,而不是邏輯與,但由於邏輯and可以」爲了廣播而重載(有充分的理由),NumPy使用&作爲布爾數組上的邏輯AND。 &and的優先級不同,因此您需要將一些操作用括號括起來,這些操作不需要用and加括號。

+0

「NumPy使用'&'在布爾數組上進行邏輯與操作」實際上是有意義的,因爲布爾邏輯和按位操作本質上是相同的(特別是如果將True視爲1並將False視爲0 ) – DeepSpace

+0

謝謝!這是一個很好的答案,並立即修復了一切。是的,我只是使用特定的索引作爲例子。再次感謝! – golfrguy04

-1

做(X [8] == Y [8])&(X [8]!= Z [8]) 或甚至更好 X [8] == Y [8]和X [8] !'= z [8]