float('nan')
steht für NaN (not a number). Aber wie kann ich das überprüfen?
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.
float('nan')
steht für NaN (not a number). Aber wie kann ich das überprüfen?
Hier ist eine Antwort, die mit:
float('nan')
, numpy.nan
...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
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.
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.
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.
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).
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.
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)
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).
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
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.
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.
31 Stimmen
Zur Geschichte von NaN in Python, siehe PEP 754. python.org/dev/peps/pep-0754