2017-09-01 14 views
3

numpy.any()Trueを返した場合、is Trueとの比較は失敗しますが、== Trueとの比較は失敗します。なぜ誰が知っていますか?numpy.any()はTrueを返しますが、 "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

どうしてこの比較に「is」を使用していますか? [このコンテキストでは '=='は意味的に正しい比較です](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は浮動小数点です。異なる2つの基本構造を持ちながら、2つのものを同等にすることができます。 –

答えて

5

numpyは、Pythonのネイティブブーリアンとは異なるIDを持つnumpy.True_numpy.False_という独自のブール値を持っています。とにかく、あなたは、このような株式の比較

>>> 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 True(クラスboolのインスタンス)を返さないためです。

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

だから要するに、numpyのは、自身の真の価値を持っていますが、あなたはそれを印刷するとき、それはちょうどPythonのTrueに建てられたように見えます。

+1

ありがとう、これです!私はそのタイプをチェックすべきだった。ありがとう! – floren

1

numpy.anyは、numpyで使用されるdifferent datatypeであるnumpy.bool_を返します。

したがって、numpy.bool_とPython boolを同一性チェックで比較することはできません。 numpy.bool_がちょうどPythonのboolのに対し、単一のバイトが常にされるのPython intに基づいてされているので、彼らはPythonのboolを使用していない主な理由はあるnumpy.True_

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

:あなたはその後、numpyののtrueを使用する必要がありますもっと高い。

+0

'numpy'は' numpy.bool'も持っています。これはPythonのネイティブ 'bool'です。レガシーは私が推測するような奇妙なものを作成します –

関連する問題