2014-02-24 39 views
5

當矩陣中兩個條件爲True時,選擇元素的方式是什麼? 在R中,基本可以將布爾值的向量組合在一起。將邏輯語句與numpy數組組合

那麼我的目標:

A = np.array([2,2,2,2,2]) 
A < 3 and A > 1 # A < 3 & A > 1 does not work either 

Evals到: ValueError異常:有超過一個元素的數組的真值是不明確的。使用a.any()或a.all()

應該EVAL到:

array([True,True,True,True,True]) 

我的解決方法通常是總結這些布爾向量和等同於2,但必須有一個更好的辦法。它是什麼?

回答

8

你可以只使用&,如:

x = np.arange(10) 
(x<8) & (x>2) 

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

的一些細節:

  • 這工作,因爲&是簡寫numpy的ufunc bitwise_and,這對於bool類型與相同。也就是說,這也可以作爲
    bitwise_and(less(x,8), greater(x,2))
  • 闡明你需要括號,因爲在numpy的&的優先級高於<>
  • and不起作用,因爲它是曖昧numpy的數組,因此而不是猜測, numpy引發異常。
+1

括號也很重要。 'x <8 & x> 2'將會失敗並出現類似的錯誤。 – Justin

+0

另外,有趣的是,它不能用'和'代替'&'。爲什麼這個工作? – PascalVKooten

+1

我更喜歡這個解決方案,因爲它對我來說更合乎邏輯(雙關意圖),並且它更短。 – PascalVKooten

9

有一個函數,該函數:

In [8]: np.logical_and(A < 3, A > 1) 
Out[8]: array([ True, True, True, True, True], dtype=bool) 

既然你不能覆蓋在Python中and運營商總是試圖施展它的參數bool。這就是爲什麼你的代碼給出了一個錯誤。

Numpy已經爲覆蓋&運算符的數組定義了__and__函數。這是其他答案正在使用的內容。

-1

雖然這是原始的,什麼是錯的

A = [2, 2, 2, 2, 2] 
b = [] 
for i in A: 
    b.append(A[i]>1 and A[i]<3) 
print b 

輸出爲[不錯,不錯,不錯,不錯,真]

+0

這可怕地縮放。 – PascalVKooten

+2

它擊敗了速度使用numpy的全部目的。從其他答案中可以看出,有些微不足道的矢量化替代方案。 – M4rtini