1664 Stimmen

Wie kann ich auf NaN-Werte prüfen?

float('nan') steht für NaN (not a number). Aber wie kann ich das überprüfen?

31 Stimmen

Zur Geschichte von NaN in Python, siehe PEP 754. python.org/dev/peps/pep-0754

49voto

x0s Punkte 1460

Hier ist eine Antwort, die mit:

  • NaN-Implementierungen gemäß der Norm IEEE 754
    • z.B.: Python's NaN: float('nan') , numpy.nan ...
  • beliebige andere Objekte: String oder was auch immer (löst keine Ausnahmen aus, wenn es gefunden wird)

Ein NaN, das gemäß dem Standard implementiert wurde, ist der einzige Wert, für den der Ungleichheitsvergleich mit sich selbst True ergeben sollte:

def is_nan(x):
    return (x != x)

Und einige Beispiele:

import numpy as np
values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
    print(f"{repr(value):<8} : {is_nan(value)}")

Ausgabe:

nan      : True
nan      : True
55       : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False

1 Stimmen

Die Reihe, die ich überprüfe, besteht darin, dass Strings mit fehlenden Werten "nans" sind (???), so dass diese Lösung funktioniert, wo andere versagt haben.

0 Stimmen

numpy.nan ist eine reguläre Python float Objekt, genau wie die Art, die von float('nan') . Die meisten NaNs, denen Sie in NumPy begegnen, sind nicht die numpy.nan Objekt.

0 Stimmen

numpy.nan definiert seinen NaN-Wert selbständig in der zugrunde liegenden Bibliothek in C . Es wickelt nicht python's NaN. Aber jetzt entsprechen beide dem IEEE 754 Standard, da sie auf C99 API basieren.

33voto

DaveTheScientist Punkte 3071

Ich bin gerade auf dieses Problem gestoßen, aber bei mir wurde nach nan, -inf, oder inf gesucht. Ich habe einfach

if float('-inf') < float(num) < float('inf'):

Dies ist wahr für Zahlen, falsch für nan und beide inf, und wird eine Ausnahme für Dinge wie Zeichenketten oder andere Typen (die wahrscheinlich eine gute Sache ist) auslösen. Außerdem müssen keine Bibliotheken wie math oder numpy importiert werden (numpy ist so verdammt groß, dass es die Größe jeder kompilierten Anwendung verdoppelt).

12 Stimmen

math.isfinite wurde erst mit Python 3.2 eingeführt, so dass die Antwort von @DaveTheScientist aus dem Jahr 2012 stammt und nicht gerade "das Rad neu erfunden" hat - die Lösung gilt nach wie vor für diejenigen, die mit Python 2 arbeiten.

0 Stimmen

Dies kann für Leute nützlich sein, die auf NaN in einer pd.eval Ausdruck. Zum Beispiel pd.eval(float('-inf') < float('nan') < float('inf')) wird zurückgegeben False

29voto

Tomalak Punkte 320467

math.isnan()

oder vergleichen Sie die Zahl mit sich selbst. NaN ist immer != NaN, ansonsten (z.B. wenn es ist eine Zahl) sollte der Vergleich erfolgreich sein.

6 Stimmen

Für Leute, die mit Python <= 2.5 arbeiten. Nan != Nan hat nicht zuverlässig funktioniert. Stattdessen wurde numpy verwendet.

27voto

Idok Punkte 2862

Nun, ich habe diesen Beitrag eingegeben, weil ich einige Probleme mit der Funktion hatte:

math.isnan()

Es gibt Probleme, wenn Sie diesen Code ausführen:

a = "hello"
math.isnan(a)

Er löst eine Ausnahme aus. Meine Lösung für das ist, eine weitere Prüfung zu machen:

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)

5 Stimmen

Wahrscheinlich wurde es abgelehnt, weil isnan() einen Fließkommawert und keinen String annimmt. An der Funktion ist nichts auszusetzen, und die Probleme liegen nur in der versuchten Verwendung der Funktion. (Für diesen speziellen Anwendungsfall ist seine Lösung gültig, aber sie ist keine Antwort auf diese Frage).

7 Stimmen

Seien Sie vorsichtig, wenn Sie auf diese Art und Weise nach Typen suchen. Dies wird z.B. bei numpy.float32 NaN's nicht funktionieren. Besser ist es, eine try/except-Konstruktion zu verwenden: def is_nan(x): try: return math.isnan(x) except: return False

4 Stimmen

NaN tut nicht bedeuten, dass ein Wert keine gültige Zahl ist. Es ist Teil der IEEE-Gleitkommadarstellung, anzugeben, dass ein bestimmtes Ergebnis undefiniert ist, z. B. 0 / 0. Daher ist die Frage, ob "Hallo" nan ist, sinnlos.

17voto

Josh Lee Punkte 159535

Eine andere Methode, wenn Sie auf <2.6 festsitzen, kein numpy haben und keine IEEE 754-Unterstützung haben:

def isNaN(x):
    return str(x) == str(1e400*0)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X