Question Comment puis-je vérifier NaN en Python?


float('nan') résultats en Nan (pas un nombre). Mais comment puis-je vérifier pour cela? Cela devrait être très facile, mais je ne peux pas le trouver.


569
2018-06-03 13:19


origine


Réponses:


math.isnan ()

Vérifie si le flottant x est un NaN (pas un nombre). Les NaN font partie des normes IEEE 754. Opération similaire mais non limitée à inf * 0, inf / inf ou toute opération impliquant un NaN, par ex. nan * 1, renvoie un NaN.

Nouveau dans la version 2.6.

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

762
2018-06-03 13:24



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

def isNaN(num):
    return num != num

219
2018-06-03 13:22



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


88
2018-06-03 13:28



En fait, je suis juste tombé sur ça, mais pour moi, c'était en train de vérifier nan, inf ou inf. Je viens d'utiliser

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

Ceci est vrai pour les nombres, faux pour nan et les deux inf, et lèvera une exception pour des choses comme des cordes ou d'autres types (ce qui est probablement une bonne chose). Aussi, 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).


21
2017-09-25 18:22



math.isnan ()

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


18
2018-06-03 13:24



Une autre méthode si vous êtes bloqué sur <2.6, vous n'avez pas de numpy, et vous n'avez pas le support IEEE 754:

def isNaN(x):
    return str(x) == str(1e400*0)

12
2018-01-26 09:10



voici une réponse qui fonctionne avec:

  • python non unique NaN: float('nan')
  • numpy unique NaN (singleton): np.nan
  • tout autre objet: chaîne ou autre (ne soulève pas d'exceptions si rencontré)

C'est ici:

import numpy as np

def is_nan(x):
    return (x is np.nan or x != x)

Et quelques exemples:

values = [float('nan'), np.nan, 55, "string", lambda x : x]
for value in values:
    print "{:<8} : {}".format(repr(value), is_nan(value))

Sortie:

nan      : True
nan      : True
55       : False
'string' : False
<function <lambda> at 0x000000000927BF28> : False

9
2018-05-24 09:40



Avec python <2.6 je me suis retrouvé avec

def isNaN(x):
    return str(float(x)).lower() == 'nan'

Cela fonctionne pour moi avec python 2.5.1 sur une boîte Solaris 5.9 et avec python 2.6.5 sur Ubuntu 10


7
2018-06-17 08:35



Eh bien, je suis entré dans ce post, car j'ai eu quelques problèmes avec la fonction:

math.isnan()

Il y a un problème lorsque vous exécutez ce code:

a = "hello"
math.isnan(a)

Cela soulève une exception. Ma solution pour cela est de faire un autre contrôle:

def is_nan(x):
    return isinstance(x, float) and math.isnan(x)

6
2017-07-04 20:15