Problem
Man ist in einem Projekt, es wird Python eingesetzt, Daten müssen verarbeitet werden, einzelne Zahlen fehlen, die logischerweise durch ein NaN (“Not a Number”) ersetzt werden. Auf einmal stellt man fest, dass alles kompletter Wahnsinn ist. Schaut man sich das Ganze in Python ein bisschen genauer an, wird es sogar noch schlimmer als eigentlich gedacht.
Es gibt drei verschiedene Methoden, um mit Python ein NaN direkt zu erzeugen: numpy.nan, math.nan und float('nan').
Dass in Python nan != nan ist laut IEEE Standard so definiert. Doch auch bei dem Vergleich mit dem is-Operator, verhalten sich NaNs seltsam:
numpy.nan is numpy.nan
math.nan is math.nan
math.nan is numpy.nan
float('nan') is math.nan
float('nan') is numpy.nan
float('nan') is float('nan')
True # klar
True # hab ich so erwartet
False # hmm, ok interessant
False # ja, ok
False # na gut
False # What the NaN?
Noch seltsamer wird es, wenn man ein Set aus einer Liste oder einem Array bildet, in der mehr als ein float('nan') enthalten ist. Dann wundert man sich schnell, warum mehr als ein NaN im Ergebnis steckt.
set([numpy.nan, numpy.nan, 0, 1, 2])
set([float('nan'), float('nan'), 0, 1, 2])
set(numpy.array([numpy.nan, numpy.nan]))
{nan, 0, 2, 1}
{nan, nan, 2, 0, 1}
{nan, nan}
Lösung
Um zuverlässig bestimmen zu können, ob eine Variable ein NaN enthält, gibt es unterschiedliche Methoden. Numpy, math und auch pandas bieten z. B. jeweils eine Methode zur NaN-Überprüfungen an. Es ist auch möglich die Variable mit dem equals-Operator mit sich selbst zu vergleichen. Um ein korrektes Set aus einer Liste oder einem Array zu generieren, ist etwas mehr Kreativität notwendig.
Beispiel
x = float('nan')
numpy.isnan(x)
x != x
y = [numpy.nan, math.nan, 0, 2, 1]
set(y)
{x if x == x else numpy.nan for x in y}
nan
True
True
[nan, nan, 0, 2, 1]
{nan, nan, 2, 0, 1}
{nan, 0, 2, 1}
Weitere Aspekte
- IEEE 754: https://web.archive.org/web/20160806053349/http://www.csee.umbc.edu/~tsimo1/CMSC455/IEEE-754-2008.pdf
- Numpy User Guide "IEEE 754 Floating Point Special Values": https://numpy.org/doc/stable/user/misc.html
---
Autorin: Vera Müller
Lust, das nächste ToiletPaper zu schreiben? Jetzt bei jambit bewerben!