2015-04-09 5 views
7

Perché mi appare il seguente:numpy.isnan (valore) non uguale al valore == numpy.nan?

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

avrei pensato i due dovrebbero essere equivalenti?

+2

Vedere anche: http://stackoverflow.com/a/1573715/325565 (non direttamente correlato a Python, ma scritto da un membro del comitato IEEE-754 che ha definito il motivo per cui è così) –

+2

Immagino ha senso che due valori indefiniti non possano essere confrontati come identici perché sono per definizione indefiniti. Solo un po 'di confusione quando ricevi un errore nan! = Nan la prima volta! –

+1

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

risposta

8

nan != nan. È così che vengono definiti i confronti di uguaglianza su nan. È stato deciso che questo risultato è più conveniente per gli algoritmi numerici rispetto all'alternativa. Questo è specificamente il motivo per cui esiste isnan.

+0

Grazie! Questo mi ha completamente confuso per un po 'durante il debug :) –

+0

A proposito, questo è probabilmente dovuto a IEEE 754 che afferma: * Sono possibili quattro relazioni reciprocamente esclusive: minori di, uguali, maggiori e non ordinate. L'ultimo caso si verifica quando almeno un operando è NaN. Ogni NaN si confronterà non ordinato con tutto, incluso se stesso. * Modifica: Sembra che sia stato battuto per ~ 2 ore da un commento con un link che va più nel dettaglio - vedi il commento di Joe Kington alla domanda. – jedwards