2014-12-04 4 views
3

numpyarray을 사용할 때 놀라운 상황이 발생했습니다. 다음 코드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])-1+(Array[1][0]==Array[1][0]) 

반환 1 동안,

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

0를 반환 :이 리드!

이것은 의도 된 것입니까? 그렇다면 왜?

답변

4

numpy.bool_ 바닐라 파이썬 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 

이 의도 한대로 만, truthiness을 위해 그것을 사용하는 경우 괜찮지 만, 당신은 놀랄 결국 . 명시한대로 예상 동작이 복원됩니다.

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

numpys bool이 vanillas bool과 다른 동작을하도록 설계된 이유가 있는지 알고 있습니까? 또는 바닐라 bool에서 의도 된 bool의 합이 아닌가? 어쩌면 아무도 그것을 생각하지 못했습니다 ^^ – Tilman

+0

나는 그렇지 않습니다. 관심이 있으시면 [여기] (https://www.mail-archive.com/numpy-discussion%40scipy.org/msg43366.html)를 삭제하는 방법에 대한 토론이 있습니다. – jonrsharpe

+0

답장을 보내 주셔서 감사 드리며, 이로 인해 더 깨끗하고 예리한 Python 코드를 작성하게되었습니다. 내가 알아 차리지 못했던 (그리고 결코 눈치 채지 못했을 것 인) 다른 모든 이슈들을보고 나서 더욱 그렇다. – Tilman

1

문제는 자동 캐스팅이라고 생각합니다. 이 경우

:

(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 

그래서,이 버그가 아니다 :

(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 

는 두 번째 경우에는 캐스트 전에 그것을 할 수 있습니다. 그것은 다른 부분에서 자동 캐스팅입니다.