Python Numpy Bool数组上布尔运算符的和(Bug?)

Python Numpy Bool数组上布尔运算符的和(Bug?),python,arrays,python-2.7,numpy,boolean-operations,Python,Arrays,Python 2.7,Numpy,Boolean Operations,在使用numpy的arrays时,我遇到了一个令人惊讶的情况。下面的代码 (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 返

在使用
numpy
array
s时,我遇到了一个令人惊讶的情况。下面的代码

(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
,使总和不可交换


这是有意的吗?如果是这样,原因是什么?

看起来
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
>>> int(True and True)
1
这是因为:

>>> True+True
2
>>> numpy.bool_(1)+numpy.bool_(1)
True
>>> int(numpy.bool_(1)+numpy.bool_(1))
1
基本上,
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
>>> int(True and True)
1
如果您只是出于真实性的目的使用它,这是很好的,但是如果您试图在整数上下文中使用它而没有明确说明这一点,那么您最终会感到惊讶。一旦你明确了,预期的行为就会恢复:

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

我认为问题在于自动广播

在这种情况下:

(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

所以,这不是一个错误。这是一个不同部分的自动播放。

你知道为什么numpys bool的行为与vanillas bool不同吗?或者说,瓦尼拉斯·布尔的布尔总数也不是故意的吗?也许没有人考虑过^^^我没有,没有。如果你有兴趣,会有一些关于删除这些运算符的讨论。谢谢你的回答,这促使我编写更干净、更漂亮的Python代码。在看到所有其他我没有注意到(可能永远也不会注意到)的问题后,情况更是如此。