it-swarm.com.de

Zuweisen einer Variablen NaN in python ohne numpy

Die meisten Sprachen haben eine NaN-Konstante, mit der Sie einer Variablen den Wert NaN zuweisen können. Kann man python ohne numpy arbeiten?

89
zelinka

Ja - benutze float('nan'). Ab Python 3.5 können Sie auch math.nan verwenden.

>>> a = float('nan')
>>> print(a)
nan
>>> print(a + 2)
nan
>>> a == a
False
>>> import math
>>> math.isnan(a)
True
>>> # Python 3.5+
>>> math.isnan(math.nan)
True

Bei der Funktion float(...) wird die Groß- und Kleinschreibung nicht beachtet. Das Ausführen von float('NAN') oder float('naN') oder ähnlichen Aktionen funktioniert ebenfalls.

Beachten Sie, dass die Überprüfung, ob zwei Dinge, die NaN sind, gleich sind, immer false zurückgibt. Dies liegt zum Teil daran, dass zwei Dinge, die "keine Zahl" sind, nicht (streng genommen) als gleich bezeichnet werden können - siehe Was ist die Begründung für alle Vergleiche, die für IEEE754-NaN-Werte false zurückgeben? = für weitere Details und Informationen.

Verwenden Sie stattdessen math.isnan(...) , um festzustellen, ob ein Wert NaN ist oder nicht.

Darüber hinaus kann die genaue Semantik der Operation == Für den NaN-Wert subtile Probleme verursachen, wenn versucht wird, NaN in Containertypen wie list oder dict zu speichern (oder wenn ein benutzerdefinierter Container verwendet wird) Typen). Weitere Informationen finden Sie unter Überprüfen, ob NaN in einem Container vorhanden ist .


Sie können NaN-Zahlen auch mit dem Python-Modul decimal erstellen:

>>> from decimal import Decimal
>>> b = Decimal('nan')
>>> print(b)
NaN
>>> print(repr(b))
Decimal('NaN')
>>>
>>> Decimal(float('nan'))
Decimal('NaN')
>>> 
>>> import math
>>> math.isnan(b)
True

math.isnan(...) funktioniert auch mit Decimal-Objekten.


Sie können jedoch keine NaN-Zahlen in Pythons Brüche -Modul erstellen :

>>> from fractions import Fraction
>>> Fraction('nan')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\fractions.py", line 146, in __new__
    numerator)
ValueError: Invalid literal for Fraction: 'nan'
>>>
>>> Fraction(float('nan'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python35\lib\fractions.py", line 130, in __new__
    value = Fraction.from_float(numerator)
  File "C:\Python35\lib\fractions.py", line 214, in from_float
    raise ValueError("Cannot convert %r to %s." % (f, cls.__name__))
ValueError: Cannot convert nan to Fraction.

Übrigens können Sie auch float('Inf'), Decimal('Inf') oder math.inf (3.5+) ausführen, um unendliche Zahlen zuzuweisen. (Und siehe auch math.isinf(...) )

Das Ausführen von Fraction('Inf') oder Fraction(float('inf')) ist jedoch nicht zulässig und löst genau wie NaN eine Ausnahme aus.

Wenn Sie schnell und einfach prüfen möchten, ob eine Zahl weder NaN noch unendlich ist, können Sie math.isfinite(...) as of Python= 3.2+ verwenden .


Wenn Sie ähnliche Prüfungen mit komplexen Zahlen durchführen möchten, enthält das Modul cmath einen ähnlichen Satz von Funktionen und Konstanten wie das Modul math:

141
Michael0x2a
nan = float('nan')

Und jetzt haben Sie die Konstante nan.

Sie können auf ähnliche Weise NaN-Werte für decimal.Decimal erstellen:

dnan = Decimal('nan')
14
abarnert

Benutze float("nan"):

>>> float("nan")
nan
6
orlp

Sie können float('nan') ausführen, um NaN zu erhalten.

5
BrenBarn

Sie können NaN von "inf - inf" erhalten, und Sie können "inf" von einer Zahl größer als 2e308 erhalten. Daher habe ich im Allgemeinen Folgendes verwendet:

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan
3
Junior Polegato

Eine konsistentere (und weniger undurchsichtige) Methode zum Generieren von inf und -inf ist die erneute Verwendung von float ():

>> positive_inf = float('inf')
>> positive_inf
inf
>> negative_inf = float('-inf')
>> negative_inf
-inf

Beachten Sie, dass die Größe eines Floats von der Architektur abhängt. Daher sollten Sie wahrscheinlich keine magischen Zahlen wie 9e999 verwenden, auch wenn dies wahrscheinlich funktioniert.

import sys
sys.float_info
sys.float_info(max=1.7976931348623157e+308,
               max_exp=1024, max_10_exp=308,
               min=2.2250738585072014e-308, min_exp=-1021,
               min_10_exp=-307, Dig=15, mant_Dig=53,
               epsilon=2.220446049250313e-16, radix=2, rounds=1)
0
user3685621