2017-09-01 64 views
3

如果numpy.any()返回Trueis True比较失败,但是== True有效。有谁知道为什么?numpy.any()返回True,但“is True”比较失败

一个最小的例子

from __future__ import print_function 
import numpy 

a = numpy.array([True]) 

if a.any() == True: 
    print('== works') 

if a.any() is True: 
    print('is works') 

此代码的输出仅仅是== works

+0

为什么你用这个比较呢? [在这种情况下'=='是语义上正确的比较](https://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python) – CoryKramer

+0

出于同样的原因'1 == 1.0'为'True','1为1.0'为'False'。 1是一个整数,1.0是一个浮点数。具有不同的基础结构时,两件事可以是等价的。 –

回答

5

numpy有它自己的布尔值,numpy.True_numpy.False_,它们与Python的本地布尔值有不同的身份。无论如何,你应该使用==这样的股权比较

>>> a.any() is True 
False 
>>> a.any() is numpy.True_ 
True 
>>> True is numpy.True_ 
False 
>>> True == numpy.True_ 
True 
+2

实际上,根本不检查布尔型的相等性。只要做'如果a.any()'或'如果不是a.any()'。 – poke

+0

@poke timgeb是的,当然,在这个特定的布尔上下文中,我的意思是一般来说,公平检查比身份验证更可取(除非你真的试图检查身份) –

3

类型的回报是不同的:

>>> type(a.any()) 
<type 'numpy.bool_'> 
>>> type(True) 
<type 'bool'> 

所以,a.any()不是True正因为如此,这只是等于到True

3

这是因为a.any()未返回标准Python Truebool类的实例)。

>>> type(a.any()) 
<type 'numpy.bool_'> 

因此,在短期,numpy的有自己真正的价值,但是当你打印出来,它看起来就像是Python的内置True

+1

谢谢,这就是它!我应该检查类型。谢谢! – floren

1

numpy.any返回一个numpy.bool_这是一个由numpy使用的different datatype

因此,您无法使用身份检查将numpy.bool_与Python bool进行比较。你将不得不使用numpy的的true然后:numpy.True_

>>> a.any() is numpy.True_ 
True 

他们为什么不使用Python的bool是因为numpy.bool_仅仅是一个单字节,而一个Python bool是基于Python int这将永远是主要原因更贵。

+0

'numpy'也有'numpy.bool','''Python的原生''bool',遗产创造了一些奇怪的东西,我猜 –