Assigner une Nan variable en python sans numpy
6 réponses
oui -- utilisez float('nan')
. À partir de Python 3.5, vous pouvez également utiliser math.nan
.
>>> 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
la fonction float(...)
est insensible à la casse -- faire float('NAN')
ou float('naN')
ou des choses similaires fonctionneront aussi.
notez que vérifier si deux choses qui sont NaN sont égales l'une à l'autre retournera toujours false. C'est en partie parce que deux choses qui ne sont pas "un nombre" ne peuvent pas (strictement) en parlant) être dit pour être l'égal de l'un à l'autre-voir Quelle est la raison d'être de toutes les comparaisons de retourner false pour IEEE754 des valeurs NaN? pour plus de détails et d'informations.
utilisez plutôt math.isnan(...)
si vous devez déterminer si une valeur est NaN ou non.
en outre, la sémantique exacte de l'opération ==
sur la valeur de NaN peut causer des problèmes subtils en essayant de stocker NaN à l'intérieur types de conteneurs tels que list
ou dict
(ou lorsqu'on utilise des types de conteneurs personnalisés). Voir vérification de la présence de NaN dans un conteneur pour plus de détails.
vous pouvez aussi construire des nombres NaN en utilisant le module décimal "de Python 1519350920" module:
>>> 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(...)
fonctionnera aussi avec des objets décimaux.
Cependant, vous ne peut pas construire Nan nombres en Python fractions module:
>>> 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.
incidemment, vous pouvez aussi faire float('Inf')
, Decimal('Inf')
, ou math.inf
(3.5+) attribuer des nombres infinis. (Et Voir aussi math.isinf(...)
)
mais Fraction('Inf')
ou Fraction(float('inf'))
n'est pas autorisée et je vais faire une exception, comme NaN.
si vous voulez un moyen rapide et facile de vérifier si un nombre n'est ni nan ni infini, vous pouvez utiliser math.isfinite(...)
à partir de Python 3.2+.
si vous souhaitez effectuer des contrôles similaires avec des nombres complexes, le module cmath
contient un ensemble similaire de fonctions et de constantes que le module math
:
-
cmath.isnan(...)
-
cmath.isinf(...)
-
cmath.isfinite(...)
(Python 3.2+) -
cmath.nan
(Python 3.6+; équivalent àcomplex(float('nan'), 0.0)
) -
cmath.nanj
(Python 3.6+; équivalent àcomplex(0.0, float('nan'))
) -
cmath.inf
(Python 3.6+; équivalent àcomplex(float('inf'), 0.0)
) -
cmath.infj
(Python 3.6+; équivalent àcomplex(0.0, float('inf'))
)
nan = float('nan')
Et maintenant, vous avez la "constante 151920920" .
vous pouvez également créer des valeurs NaN pour décimal.Décimal.:
dnan = Decimal('nan')
vous pouvez obtenir NaN de "inf-inf", et vous pouvez obtenir "inf" d'un nombre supérieur à 2e308, donc, je généralement utilisé:
>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan
une façon plus cohérente (et moins opaque) de générer inf et-inf est d'utiliser à nouveau float ():
>> positive_inf = float('inf')
>> positive_inf
inf
>> negative_inf = float('-inf')
>> negative_inf
-inf
notez que la taille d'un flotteur varie en fonction de l'architecture, il est donc préférable d'éviter d'utiliser des nombres magiques comme 9e999, même si cela est susceptible de fonctionner.
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)