2017-09-01 63 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',遺產創造了一些奇怪的東西,我猜 –