Numpy Bool阵列上的布尔运算符之和(Bug?)

时间:2014-12-04 16:07:36

标签: python arrays python-2.7 numpy boolean-operations

使用numpy的{​​{1}}时,我遇到了令人惊讶的情况。以下代码

array
正如人们所料,

返回(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]) ,使得总和不可交换!

这是打算吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:4)

numpy.bool_似乎与vanilla 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

答案 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

在第二种情况下,演员之前是这样做的:

(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

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