stackoverflow.com/questions/944700 informa como verificar o NaN. Para Inf e -Inf, você pode testar com ==, mas isso não funciona para o NaN por causa das regras IEEE754 para o NaN.
David Heffernan
Eu acho que a maneira mais confiável é usar funções apropriadas como isinfe isnanconforme fornecido por numpy. Veja minha resposta abaixo.
Isso vai me ensinar a não dar uma piada antes de ler a pergunta pela segunda vez !! Desculpe! Dito isto, não faria mal para dizer isso tudo a mesma coisa, porque isso é uma armadilha fácil de cair, NaN = NaN!
David Heffernan
2
observe também: >>> 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
No python> = 2.6, você pode apenas usar math.isnan()emath.isinf()
Agos
8
numpyé bastante uma importação pesado se tudo que você quer é NaNouinf
CZ
1
Se tudo que você precisa é NaNou Inf, alguém poderia from numpy import nan, infexistir desde que essa questão foi levantada.
andrewgu 27/02/19
37
É possível definir um número para NaN ou infinito?
Sim, de fato, existem várias maneiras. Alguns funcionam sem nenhuma importação, enquanto outros exigem import, no entanto, para esta resposta, limitarei as bibliotecas da visão geral à biblioteca padrão e ao NumPy (que não é uma biblioteca padrão, mas uma biblioteca de terceiros muito comum).
A tabela a seguir resume as maneiras pelas quais se pode criar um infinito não-numérico ou positivo ou negativo float:
As opções com ¹ retornam uma planície float, não a complex.
existe alguma função para verificar se um número é infinito ou não?
Sim, existe - de fato, existem várias funções para NaN, Infinity e nem Nan nem Inf. No entanto, essas funções predefinidas não são internas, elas sempre exigem um import:
O cmathenumpy funções também funcionam para objetos complexos; eles verificarão se a parte real ou imaginária é NaN ou Infinity.
As numpyfunções também funcionam para numpymatrizes e tudo o que pode ser convertido em uma (como listas, tupla, etc.)
Também existem funções que verificam explicitamente o infinito positivo e negativo no NumPy: numpy.isposinfe numpy.isneginf.
O Pandas oferece duas funções adicionais a serem verificadas NaN: pandas.isnae pandas.isnull(mas não apenas o NaN, ele também combina Nonee NaT)
Mesmo que não existam funções internas, seria fácil criá-las você mesmo (negligenciei a verificação e a documentação do tipo aqui):
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 os resultados esperados para essas funções (assumindo que a entrada seja flutuante):
No entanto, se você quiser incluí-lo em um array(por exemplo array.arrayou numpy.array), o tipo da matriz deve ser floatou complexporque, caso contrário, tentará fazer o downcast para o tipo de matrizes!
Nota: math.isnannão funciona com números complexos. Use em math.isnan(x.real) or math.isnan(x.imag)vez disso.
Jonathan H
2
Ao usar o Python 2.4, tente
inf = float("9e999")
nan = inf - inf
Estou enfrentando o problema quando estava portando o simplejson para um dispositivo incorporado que executava o Python 2.4, o float("9e999")corrigiu. Não use inf = 9e999, você precisa convertê-lo de string.
-infdá o -Infinity.
isinf
eisnan
conforme fornecido pornumpy
. Veja minha resposta abaixo.Respostas:
Transmitir da string usando
float()
:fonte
Sim, você pode usar
numpy
para isso.fonte
math.isnan()
emath.isinf()
numpy
é bastante uma importação pesado se tudo que você quer éNaN
ouinf
NaN
ouInf
, alguém poderiafrom numpy import nan, inf
existir desde que essa questão foi levantada.Sim, de fato, existem várias maneiras. Alguns funcionam sem nenhuma importação, enquanto outros exigem
import
, no entanto, para esta resposta, limitarei as bibliotecas da visão geral à biblioteca padrão e ao NumPy (que não é uma biblioteca padrão, mas uma biblioteca de terceiros muito comum).A tabela a seguir resume as maneiras pelas quais se pode criar um infinito não-numérico ou positivo ou negativo
float
:Algumas observações para a mesa:
float
construtor não diferencia maiúsculas de minúsculas, então você também pode usarfloat("NaN")
orfloat("InFiNiTy")
.cmath
enumpy
retornamfloat
objetos Python simples .numpy.NINF
verdade, é a única constante que conheço que não requer o-
.É possível criar NaN e Infinity complexos com
complex
ecmath
:As opções com ¹ retornam uma planície
float
, não acomplex
.Sim, existe - de fato, existem várias funções para NaN, Infinity e nem Nan nem Inf. No entanto, essas funções predefinidas não são internas, elas sempre exigem um
import
:Novamente, algumas observações:
cmath
enumpy
funções também funcionam para objetos complexos; eles verificarão se a parte real ou imaginária é NaN ou Infinity.numpy
funções também funcionam paranumpy
matrizes e tudo o que pode ser convertido em uma (como listas, tupla, etc.)numpy.isposinf
enumpy.isneginf
.NaN
:pandas.isna
epandas.isnull
(mas não apenas o NaN, ele também combinaNone
eNaT
)Mesmo que não existam funções internas, seria fácil criá-las você mesmo (negligenciei a verificação e a documentação do tipo aqui):
Para resumir os resultados esperados para essas funções (assumindo que a entrada seja flutuante):
Em uma lista, não há problema, você sempre pode incluir NaN (ou Infinity) lá:
No entanto, se você quiser incluí-lo em um
array
(por exemploarray.array
ounumpy.array
), o tipo da matriz deve serfloat
oucomplex
porque, caso contrário, tentará fazer o downcast para o tipo de matrizes!fonte
math.isnan
não funciona com números complexos. Use emmath.isnan(x.real) or math.isnan(x.imag)
vez disso.Ao usar o Python 2.4, tente
Estou enfrentando o problema quando estava portando o simplejson para um dispositivo incorporado que executava o Python 2.4, o
float("9e999")
corrigiu. Não useinf = 9e999
, você precisa convertê-lo de string.-inf
dá o-Infinity
.fonte