stackoverflow.com/questions/944700 le indica cómo verificar si hay NaN. Para Inf e -Inf puede probar con == pero eso no funciona para NaN debido a las reglas IEEE754 para NaN.
David Heffernan
Creo que la forma más confiable es usar funciones adecuadas como isinfy isnansegún lo provisto por numpy. Vea mi respuesta a continuación.
¡Eso me enseñará a no saltar con una broma antes de leer la pregunta por segunda vez! ¡Lo siento! Dicho esto, no estaría de más decirlo de todos modos porque es una trampa fácil de caer, NaN! = NaN
David Heffernan
2
también tenga en cuenta: >>> float ('Inf') - float ('Inf') ===> nan
import numpy as np
a = arange(3,dtype=float)
a[0]= np.nan
a[1]= np.inf
a[2]=-np.inf
a # is now [nan,inf,-inf]
np.isnan(a[0])# True
np.isinf(a[1])# True
np.isinf(a[2])# True
En python> = 2.6, puede usar math.isnan()ymath.isinf()
Agos
8
numpyes una gran importación si todo lo que quieres es NaNoinf
cz
1
Si todo lo que necesita es NaNo Inf, uno podría from numpy import nan, infhaber existido desde que se planteó esta pregunta.
andrewgu
37
¿Es posible establecer un número en NaN o infinito?
Sí, de hecho hay varias formas. Algunos funcionan sin ninguna importación, mientras que otros requieren import, sin embargo, para esta respuesta, limitaré las bibliotecas en la descripción general a biblioteca estándar y NumPy (que no es biblioteca estándar sino una biblioteca de terceros muy común).
La siguiente tabla resume las formas en que uno puede crear un no-número o un infinito positivo o negativo float:
Las opciones con ¹ devuelven un simple float, no un complex.
¿Hay alguna función para verificar si un número es infinito o no?
Sí, hay, de hecho, hay varias funciones para NaN, Infinity, y ni Nan ni Inf. Sin embargo, estas funciones predefinidas no están integradas, siempre requieren un import:
Las funciones cmathy numpytambién funcionan para objetos complejos, verifican si la parte real o imaginaria es NaN o Infinity.
Las numpyfunciones también funcionan para numpymatrices y todo lo que se puede convertir en uno (como listas, tuplas, etc.)
También hay funciones que comprueban explícitamente el infinito positivo y negativo en NumPy: numpy.isposinfy numpy.isneginf.
Pandas ofrece dos funciones adicionales para verificar NaN: pandas.isnay pandas.isnull(pero no solo NaN, también coincide Noney NaT)
Aunque no hay funciones integradas, sería fácil crearlas usted mismo (descuidé la verificación de tipo y la documentación aquí):
def isnan(value):return value != value # NaN is not equal to anything, not even itself
infinity = float("infinity")def isinf(value):return abs(value)== infinity
def isfinite(value):returnnot(isnan(value)or isinf(value))
Para resumir los resultados esperados para estas funciones (suponiendo que la entrada es flotante):
Sin embargo, si desea incluirlo en un array(por ejemplo, array.arrayo numpy.array), entonces el tipo de matriz debe ser floato complexporque, de lo contrario, intentará reducirlo al tipo de matriz.
Nota: math.isnanno funciona con números complejos. Usar en su math.isnan(x.real) or math.isnan(x.imag)lugar.
Jonathan H
2
Cuando use Python 2.4, intente
inf = float("9e999")
nan = inf - inf
Estoy enfrentando el problema cuando estaba portando el simplejson a un dispositivo incrustado que ejecuta Python 2.4, lo float("9e999")solucionó. No lo use inf = 9e999, necesita convertirlo de una cadena.
-infda el -Infinity.
isinfyisnansegún lo provisto pornumpy. Vea mi respuesta a continuación.Respuestas:
Transmitir desde una cadena usando
float():fuente
Sí, puedes usar
numpypara eso.fuente
math.isnan()ymath.isinf()numpyes una gran importación si todo lo que quieres esNaNoinfNaNoInf, uno podríafrom numpy import nan, infhaber existido desde que se planteó esta pregunta.Sí, de hecho hay varias formas. Algunos funcionan sin ninguna importación, mientras que otros requieren
import, sin embargo, para esta respuesta, limitaré las bibliotecas en la descripción general a biblioteca estándar y NumPy (que no es biblioteca estándar sino una biblioteca de terceros muy común).La siguiente tabla resume las formas en que uno puede crear un no-número o un infinito positivo o negativo
float:Un par de comentarios a la mesa:
floatconstructor no distingue entre mayúsculas y minúsculas, por lo que también puede usarfloat("NaN")ofloat("InFiNiTy").cmathynumpydevuelvenfloatobjetos Python simples .numpy.NINFrealidad, es la única constante que conozco que no requiere-.Es posible crear NaN e Infinity complejos con
complexycmath:Las opciones con ¹ devuelven un simple
float, no uncomplex.Sí, hay, de hecho, hay varias funciones para NaN, Infinity, y ni Nan ni Inf. Sin embargo, estas funciones predefinidas no están integradas, siempre requieren un
import:De nuevo un par de comentarios:
cmathynumpytambién funcionan para objetos complejos, verifican si la parte real o imaginaria es NaN o Infinity.numpyfunciones también funcionan paranumpymatrices y todo lo que se puede convertir en uno (como listas, tuplas, etc.)numpy.isposinfynumpy.isneginf.NaN:pandas.isnaypandas.isnull(pero no solo NaN, también coincideNoneyNaT)Aunque no hay funciones integradas, sería fácil crearlas usted mismo (descuidé la verificación de tipo y la documentación aquí):
Para resumir los resultados esperados para estas funciones (suponiendo que la entrada es flotante):
En una lista no hay problema, siempre puedes incluir NaN (o Infinity) allí:
Sin embargo, si desea incluirlo en un
array(por ejemplo,array.arrayonumpy.array), entonces el tipo de matriz debe serfloatocomplexporque, de lo contrario, intentará reducirlo al tipo de matriz.fuente
math.isnanno funciona con números complejos. Usar en sumath.isnan(x.real) or math.isnan(x.imag)lugar.Cuando use Python 2.4, intente
Estoy enfrentando el problema cuando estaba portando el simplejson a un dispositivo incrustado que ejecuta Python 2.4, lo
float("9e999")solucionó. No lo useinf = 9e999, necesita convertirlo de una cadena.-infda el-Infinity.fuente