Pregunta ¿Cómo puedo verificar NaN en Python?


float('nan') resultados en Nan (no es un número). ¿Pero cómo lo verifico? Debería ser muy fácil, pero no puedo encontrarlo.


569
2018-06-03 13:19


origen


Respuestas:


math.isnan ()

Comprueba si el flotante x es un NaN (no un número). Los NaN son parte de los estándares IEEE 754. El funcionamiento es, pero no se limita a, inf * 0, inf / inf o cualquier operación que implique un NaN, p. nan * 1, devuelve un NaN.

Nuevo en la versión 2.6.

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

762
2018-06-03 13:24



La forma habitual de probar un NaN es ver si es igual a sí mismo:

def isNaN(num):
    return num != num

219
2018-06-03 13:22



numpy.isnan(number) te dice si es NaN o no en Python 2.5.


88
2018-06-03 13:28



De hecho, me encontré con esto, pero para mí fue buscando nan, -inf o inf. Acabo de usar

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

Esto es cierto para los números, falso para nan y both inf, y generará una excepción para cosas como cadenas u otros tipos (que probablemente sea algo bueno). Además, esto no requiere la importación de bibliotecas como math o numpy (numpy es tan grande que dobla el tamaño de cualquier aplicación compilada).


21
2017-09-25 18:22



math.isnan ()

o compara el número consigo mismo. NaN siempre es! = NaN, de lo contrario (por ejemplo, si es un número) la comparación debería tener éxito.


18
2018-06-03 13:24



Otro método si estás atascado en <2.6, no tienes numpy y no tienes soporte para IEEE 754:

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

12
2018-01-26 09:10



Aquí hay una respuesta que trabaja con:

  • pitón no único Yaya: float('nan')
  • numpy único NaN (singleton): np.nan
  • cualquier otro objeto: cadena o lo que sea (no genera excepciones si se encuentra)

Aquí está:

import numpy as np

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

Y algunos ejemplos:

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

Salida:

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

9
2018-05-24 09:40



Con Python <2.6 terminé con

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

Esto funciona para mí con python 2.5.1 en una caja de Solaris 5.9 y con python 2.6.5 en Ubuntu 10


7
2018-06-17 08:35



Bueno, entré en esta publicación porque tuve algunos problemas con la función:

math.isnan()

Hay un problema cuando ejecuta este código:

a = "hello"
math.isnan(a)

Se plantea una excepción. Mi solución para eso es hacer otra verificación:

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

6
2017-07-04 20:15



Estoy recibiendo los datos de un servicio web que envía NaN como una cadena 'Nan'. Pero también podría haber otros tipos de cadenas en mis datos, por lo que un simple float(value) podría lanzar una excepción. Utilicé la siguiente variante de la respuesta aceptada:

def isnan(value):
  try:
      import math
      return math.isnan(float(value))
  except:
      return False

Requisito:

isnan('hello') == False
isnan('NaN') == True
isnan(100) == False
isnan(float('nan')) = True

1
2018-06-23 08:22