2015-04-09 8 views
7

Warum erhalte ich folgendes:numpy.isnan (Wert) nicht dasselbe wie Wert == numpy.nan?

>>> v 
nan 
>>> type(v) 
<type 'numpy.float64'> 
>>> v == np.nan 
False 
>>> np.isnan(v) 
True 

ich die beiden sollten gleichwertig sein hätte das gedacht?

+2

Siehe auch: http://Stackoverflow.com/a/1573715/325565 (nicht direkt Python-bezogen, aber von einem Mitglied des IEEE-754-Komitee, das definiert, warum dies so ist) –

+2

Ich denke, geschrieben Es macht Sinn, dass zwei undefinierte Werte nicht als identisch verglichen werden können, da sie definitionsgemäß undefiniert sind. Nur ein wenig verwirrend, wenn man beim ersten mal einen NanO = NanFehler bekommt! –

+1

verwandt: http://stackoverflow.com/q/13003202/674039 – wim

Antwort

8

nan != nan. So werden Gleichheitsvergleiche auf nan definiert. Es wurde entschieden, dass dieses Ergebnis für numerische Algorithmen bequemer ist als die Alternative. Dies ist der Grund, warum isnan existiert.

+0

Danke! Das verwirrte mich eine ganze Weile beim Debuggen :) –

+0

Übrigens ist dies wahrscheinlich auf IEEE 754 zurückzuführen, die besagt: * Vier sich gegenseitig ausschließende Beziehungen sind möglich: weniger als, gleich, größer als und ungeordnet. Der letzte Fall tritt auf, wenn mindestens ein Operand NaN ist. Jedes NaN soll ungeordnet mit allem, einschließlich sich selbst, verglichen werden. * Edit: Sieht so aus, als ob ich durch ~ 2 Stunden durch einen Kommentar mit einem ausführlicheren Link geschlagen wurde - siehe Joe Kingtons Kommentar zu der Frage. – jedwards