1295 votes

Comment puis-je vérifier les valeurs NaN ?

float('nan') résulte en Nan (pas un numéro). Mais comment puis-je le vérifier ? Cela devrait être très facile, mais je ne le trouve pas.

25 votes

Pour un historique des NaN en Python, voir PEP 754. python.org/dev/peps/pep-0754

1663voto

gimel Points 30150

math.isnan(x)

Retourner à True si x est un NaN (pas un nombre), et False autrement.

import math x = float('nan') math.isnan(x) True

0 votes

Notez que cela fonctionne aussi bien avec float("nan") comme il le fait avec numpy.core.numeric.NaN tout en comparant les deux avec is ne fonctionne pas. Par conséquent, cela pourrait être la solution préférable dans le code (hérité ?) contenant éventuellement les deux définitions, si je ne me trompe pas ?

0 votes

Il existe de multiples variétés de NaN, donc je ne sais pas ce que fait l'opérateur is dans ce scénario ?

1 votes

J'ai obtenu une erreur avec le code ci-dessus. Est-ce à cause de python 3 ? Cependant, numpy.isnan(float('nan')) a fonctionné. Pourquoi devrais-je utiliser math au lieu de numpy ?

466voto

Chris Jester-Young Points 102876

La façon habituelle de tester un NaN est de voir s'il est égal à lui-même :

def isNaN(num):
    return num != num

8 votes

Avertissement : citant le commentaire de Bear ci-dessous "Pour les personnes coincées avec python <= 2.5. Nan != Nan n'a pas fonctionné de manière fiable. Utilisez numpy à la place". Cela dit, je ne l'ai en fait jamais vu échouer.

35 votes

Je suis sûr que, étant donné la surcharge des opérateurs, il y a beaucoup de façons dont je pourrais confondre cette fonction. allez avec math.isnan()

5 votes

Il est dit dans la spécification 754 mentionnée ci-dessus que NaN==NaN doit toujours être faux, bien que cela ne soit pas toujours implémenté comme tel. N'est-il pas possible que ce soit la façon dont les maths et/ou numpy vérifient cela sous le capot de toute façon ?

214voto

mavnn Points 3359

numpy.isnan(number) vous dit si c'est NaN ou pas.

1 votes

Merci, je suis resté sur la 2.5, c'est exactement ce dont j'avais besoin.

3 votes

Fonctionne également dans la version 2.7 de python.

7 votes

numpy.all(numpy.isnan(data_list)) est également utile si vous avez besoin de déterminer si tous les éléments de la liste sont nan.

33voto

DaveTheScientist Points 610

Je viens de rencontrer ce problème, mais pour moi, il s'agissait de vérifier si nan, -inf ou inf étaient présents. J'ai juste utilisé

if float('-inf') < float(num) < float('inf'):

Ceci est vrai pour les nombres, faux pour les nan et les deux inf, et soulèvera une exception pour des choses comme les chaînes de caractères ou d'autres types (ce qui est probablement une bonne chose). De plus, cela ne nécessite pas d'importer des bibliothèques comme math ou numpy (numpy est tellement gros qu'il double la taille de toute application compilée).

12 votes

math.isfinite n'a pas été introduit avant Python 3.2, donc étant donné que la réponse de @DaveTheScientist a été postée en 2012, ce n'était pas exactement "réinventer la roue" - la solution reste valable pour ceux qui travaillent avec Python 2.

0 votes

Cela peut être utile pour les personnes qui ont besoin de vérifier si un NaN est présent dans un fichier pd.eval l'expression. Par exemple pd.eval(float('-inf') < float('nan') < float('inf')) retournera False

26voto

Tomalak Points 150423

math.isnan()

ou de comparer le nombre à lui-même. NaN est toujours != NaN, sinon (par exemple si c'est est un nombre) la comparaison devrait réussir.

6 votes

Pour les personnes coincées avec python <= 2.5. Nan != Nan ne fonctionnait pas de manière fiable. On utilise numpy à la place.

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