2017-09-01 1 views
3

Wenn numpy.any()True zurückgibt, schlägt der Vergleich mit is True fehl, aber mit == True funktioniert. Weiß jemand warum?numpy.any() gibt True zurück, aber "ist True" Vergleich fehlgeschlagen

Ein minimales Beispiel

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') 

Der Ausgang dieses Codes ist gerade == works.

+0

Warum verwenden Sie 'ist' für diesen Vergleich überhaupt? [In diesem Zusammenhang ist == 'der semantisch korrekte Vergleich] (https://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python) – CoryKramer

+0

Aus dem gleichen Grund '1 == 1.0' ist' True' und '1 ist 1.0' ist' False'. 1 ist eine Ganzzahl, 1.0 ist ein Gleitkommawert. Zwei Dinge können gleichwertig sein, während sie unterschiedliche zugrunde liegende Strukturen haben. –

Antwort

5

numpy hat eigene booleans, numpy.True_ und numpy.False_, die verschiedene Identitäten von Python nativen Booleans haben. Auf jeden Fall sollten Sie == solche Aktien Vergleiche

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

Eigentlich nicht auf boolesche Gleichheit überhaupt prüfen. Tun Sie einfach 'if a.any() 'oder' if not a.any() '. – poke

+0

@poke timgeb Ja, natürlich, in diesem speziellen booleschen Zusammenhang, meinte ich im Allgemeinen, dass Equity Checks den Identitäten vorzuziehen sind (es sei denn, du versuchst tatsächlich, die Identität des Kurses zu überprüfen) –

3

Die Arten der Erträge werden mit unterschiedlich sind:

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

So a.any() nicht True als solche, es ist nur gleich zu True.

3

Das liegt daran, a.any() gibt nicht den Standard Python True (eine Instanz der Klasse bool) zurück.

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

kurz So numpy hat seinen eigenen Wahr-Wert, aber wenn Sie es drucken, es sieht aus wie Pythons in True gebaut.

+1

Danke, das ist es! Ich hätte den Typ überprüfen sollen. Vielen Dank! – floren

1

numpy.any gibt eine numpy.bool_ zurück, die different datatype von numpy verwendet wird.

So können Sie nicht vergleichen numpy.bool_ mit einem Python bool mit einer Identitätsprüfung. Sie würden numpy die true dann verwenden: numpy.True_

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

Der Hauptgrund, warum sie nicht Python verwenden bool ist, weil numpy.bool_ ist nur ein einziges Byte während eine Python bool auf dem Python int basiert, die immer sein wird, teurer.

+0

'numpy' hat auch' numpy.bool', was '' '' Pythons native 'bool' ist, Legacy erzeugt einige seltsame Dinge, denke ich –

Verwandte Themen