2014-12-04 75 views
3

當使用numpyarray s時,我遇到了令人驚訝的情況。以下代碼Numpy Bool陣列布爾運算符的總和(錯誤?)

(True==True)+(True==True) 

返回2,正如人們所期望的那樣。而

import numpy 
Array=numpy.zeros((2,2),dtype=bool) 
(Array[0][0]==Array[0][0])+(Array[1][0]==Array[1][0]) 

返回True。這導致:

(Array[0][0]==Array[0][0])+(Array[1][0]==Array[1][0])-1 

返回0,而

(Array[0][0]==Array[0][0])-1+(Array[1][0]==Array[1][0]) 

回報1,使之和不可交換!

這是打算?如果是這樣,爲什麼?

回答

4

這樣看來,numpy.bool_略有不同行爲與香草的Python bool

>>> int(True+True) == int(True) + int(True) 
True 
>>> int(numpy.bool_(1)+numpy.bool_(1)) == int(numpy.bool_(1)) + int(numpy.bool_(1)) 
False 

這是因爲:

>>> True+True 
2 
>>> numpy.bool_(1)+numpy.bool_(1) 
True 
>>> int(numpy.bool_(1)+numpy.bool_(1)) 
1 

基本上,對於numpy.bool_加法操作是合乎邏輯的,而不是數值;與bool以獲得相同的行爲:

>>> int(True and True) 
1 

這是好的,如果你只會用它來感實性,如預期,但如果您嘗試使用它在整數上下文沒有被明確有關,你最終會驚訝。只要你明確,預期的行爲恢復:

>>> int(numpy.bool_(1)) + int(numpy.bool_(1)) 
2 
+0

你知道,爲什麼numpys bool的設計表現出與香草bool不同的原因嗎?還是不是在香草布爾的意圖的總和呢? 也許沒人給它一個想法^^ – Tilman 2014-12-04 16:40:12

+0

我沒有,沒有。如果您有興趣,有一些關於刪除這些運營商的討論(這裏是https://www.mail-archive.com/numpy-discussion%40scipy.org/msg43366.html)。 – jonrsharpe 2014-12-04 16:42:21

+0

感謝您的回答,這促使我寫出更乾淨更漂亮的Python代碼。在看到我沒有注意到的所有其他問題(甚至可能永遠不會注意到)之後更是如此。 – Tilman 2014-12-04 17:04:21

1

我認爲問題是自動生成。

在這種情況下

(Array[0][0]==Array[0][0])+(Array[1][0]==Array[1][0])-1 
Python do: 
(Array[0][0]==Array[0][0])+(Array[1][0]==Array[1][0]) = True 
True -1 =cast= 1 -1 = 0 

在第二種情況下,中投之前做到這一點:

(Array[0][0]==Array[0][0])-1+(Array[1][0]==Array[1][0]) 
True - 1 + True 
(True - 1 =cast= 0) 
0 + True =cast again= 0+ 1 = 1 

所以,這不是一個錯誤。這是一個不同部分的自動配對。