使用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])
,使得总和不可交换!
这是打算吗?如果是这样,为什么?
答案 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
所以,这不是一个错误。这是一个不同部分的自动播放。