120 votes

Attribution d'une variable NaN en python sans numpy

La plupart des langages ont une constante NaN que vous pouvez utiliser pour attribuer une variable la valeur NaN. Python peut-il le faire sans utiliser numpy?

202voto

Michael0x2a Points 9116

Oui -- utilisez math.nan.

>>> from math import nan
>>> print(nan)
nan
>>> print(nan + 2)
nan
>>> nan == nan
False
>>> import math
>>> math.isnan(nan)
True

Avant Python 3.5, on pouvait utiliser float("nan") (insensible à la casse).

Notez que vérifier si deux choses qui sont NaN sont égales l'une à l'autre renverra toujours faux. Cela est en partie dû au fait que deux choses qui ne sont "pas un nombre" ne peuvent pas (strictement parlant) être dites égales l'une à l'autre -- voir Quelle est la raison pour laquelle toutes les comparaisons renvoient faux pour les valeurs NaN IEEE754 ? 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.

De plus, les sémantiques exactes de l'opération == sur la valeur NaN peuvent entraîner des problèmes subtils lors de la tentative de stockage de NaN à l'intérieur de types de conteneurs tels que list ou dict (ou lors de l'utilisation de types de conteneurs personnalisés). Voir Vérification de la présence de NaN dans un conteneur pour plus de détails.


Vous pouvez également construire des nombres NaN en utilisant le module decimal de Python :

>>> 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 également avec les objets Decimal.


Cependant, vous ne pouvez pas construire des nombres NaN dans le module fractions de Python :

>>> from fractions import Fraction
>>> Fraction('nan')
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Python35\lib\fractions.py", line 146, in __new__
    numerator)
ValueError: Litéral invalide pour Fraction : 'nan'
>>>
>>> Fraction(float('nan'))
Traceback (most recent call last):
  File "", line 1, in 
  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("Impossible de convertir %r en %s." % (f, cls.__name__))
ValueError: Impossible de convertir nan en Fraction.

Accessoirement, vous pouvez également faire float('Inf'), Decimal('Inf'), ou math.inf (3.5+) pour assigner des nombres infinis. (Et voir aussi math.isinf(...))

Cependant, faire Fraction('Inf') ou Fraction(float('inf')) n'est pas autorisé et va déclencher une exception, tout 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 voulez effectuer des vérifications similaires avec des nombres complexes, le module cmath contient un ensemble similaire de fonctions et constantes que le module math :

23voto

abarnert Points 94246
nan = float('nan')

Et maintenant vous avez la constante, nan.

Vous pouvez également créer des valeurs NaN pour decimal.Decimal :

dnan = Decimal('nan')

11voto

nightcracker Points 34498

Utilisez float("nan") :

>>> float("nan")
nan

11voto

Junior Polegato Points 151

Vous pouvez obtenir NaN de "inf - inf", et vous pouvez obtenir "inf" d'un nombre supérieur à 2e308, donc, j'utilise généralement :

>>> inf = 9e999
>>> inf
inf
>>> inf - inf
nan

8voto

BrenBarn Points 63718

Vous pouvez faire float('nan') pour obtenir NaN.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X