Assigner une Nan variable en python sans numpy

la plupart des langues ont une constante Nan que vous pouvez utiliser pour assigner une variable la valeur NaN. Python peut-il faire cela sans utiliser numpy?

69
demandé sur zelinka 2013-10-15 10:02:06

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 :

108
répondu Michael0x2a 2017-07-09 04:05:13
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')
11
répondu abarnert 2013-10-15 06:05:56

utiliser float("nan") :

>>> float("nan")
nan
6
répondu orlp 2013-10-15 06:05:20

vous pouvez faire float('nan') pour avoir NaN.

5
répondu BrenBarn 2013-10-15 06:05:34

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
1
répondu Junior Polegato 2016-05-04 21:20:30

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)
0
répondu user3685621 2016-01-21 22:02:08