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.
isinf
yisnan
según lo provisto pornumpy
. Vea mi respuesta a continuación.Respuestas:
Transmitir desde una cadena usando
float()
:fuente
Sí, puedes usar
numpy
para eso.fuente
math.isnan()
ymath.isinf()
numpy
es una gran importación si todo lo que quieres esNaN
oinf
NaN
oInf
, uno podríafrom numpy import nan, inf
haber 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:
float
constructor no distingue entre mayúsculas y minúsculas, por lo que también puede usarfloat("NaN")
ofloat("InFiNiTy")
.cmath
ynumpy
devuelvenfloat
objetos Python simples .numpy.NINF
realidad, es la única constante que conozco que no requiere-
.Es posible crear NaN e Infinity complejos con
complex
ycmath
: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:
cmath
ynumpy
también funcionan para objetos complejos, verifican si la parte real o imaginaria es NaN o Infinity.numpy
funciones también funcionan paranumpy
matrices y todo lo que se puede convertir en uno (como listas, tuplas, etc.)numpy.isposinf
ynumpy.isneginf
.NaN
:pandas.isna
ypandas.isnull
(pero no solo NaN, también coincideNone
yNaT
)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.array
onumpy.array
), entonces el tipo de matriz debe serfloat
ocomplex
porque, de lo contrario, intentará reducirlo al tipo de matriz.fuente
math.isnan
no 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.-inf
da el-Infinity
.fuente