2014-12-04 76 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 

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