stackoverflow.com/questions/944700 vous indique comment vérifier la présence de NaN. Pour Inf et -Inf, vous pouvez tester avec == mais cela ne fonctionne pas pour NaN en raison des règles IEEE754 pour NaN.
David Heffernan
Je pense que le moyen le plus fiable consiste à utiliser les fonctions appropriées comme isinfet telles isnanque fournies par numpy. Voir ma réponse ci-dessous.
Cela m'apprendra à ne pas sauter dessus avant de lire la question une deuxième fois !! Désolé! Cela dit, cela ne ferait pas de mal de le dire tout de même car c'est un piège facile à tomber, NaN! = NaN
David Heffernan
2
notez également: >>> 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
Sur python> = 2.6, vous pouvez simplement utiliser math.isnan()etmath.isinf()
Agos
8
numpyest une importation assez lourde si tout ce que vous voulez est NaNouinf
cz
1
Si tout ce dont vous avez besoin est NaNou Inf, celui from numpy import nan, infqui pourrait exister depuis que cette question a été soulevée.
andrewgu
37
Est-il possible de définir un nombre à NaN ou à l'infini?
Oui, en fait, il existe plusieurs façons. Quelques-uns fonctionnent sans aucune importation, tandis que d'autres nécessitent import, mais pour cette réponse, je limiterai les bibliothèques de l'aperçu à la bibliothèque standard et à NumPy (qui n'est pas une bibliothèque standard mais une bibliothèque tierce très courante).
Le tableau suivant résume les façons dont on peut créer un infini pas un nombre ou un infini positif ou négatif float:
Les options avec ¹ renvoient une plaine float, pas un complex.
existe-t-il une fonction pour vérifier si un nombre est infini ou non?
Oui, il existe - en fait, il existe plusieurs fonctions pour NaN, Infinity et ni Nan ni Inf. Cependant, ces fonctions prédéfinies ne sont pas intégrées, elles nécessitent toujours import:
Les fonctions cmathet numpyfonctionnent également pour les objets complexes, elles vérifieront si la partie réelle ou imaginaire est NaN ou Infinity.
Les numpyfonctions fonctionnent également pour les numpytableaux et tout ce qui peut être converti en un (comme les listes, les tuples, etc.)
Il existe également des fonctions qui vérifient explicitement l'infini positif et négatif dans NumPy: numpy.isposinfet numpy.isneginf.
Pandas propose deux fonctions supplémentaires à vérifier NaN: pandas.isnaet pandas.isnull(mais pas seulement NaN, il correspond également à Noneet NaT)
Même s'il n'y a pas de fonctions intégrées, il serait facile de les créer vous-même (j'ai négligé la vérification de type et la documentation ici):
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))
Pour résumer les résultats attendus pour ces fonctions (en supposant que l'entrée est un flottant):
Cependant, si vous souhaitez l'inclure dans un array(par exemple array.arrayou numpy.array), le type du tableau doit être floatou complexparce que sinon, il essaiera de le convertir en type de tableaux!
Remarque: math.isnanne fonctionne pas avec des nombres complexes. Utilisez math.isnan(x.real) or math.isnan(x.imag)plutôt.
Jonathan H
2
Lorsque vous utilisez Python 2.4, essayez
inf = float("9e999")
nan = inf - inf
Je suis confronté au problème lorsque je portais le simplejson sur un périphérique intégré qui exécutant Python 2.4, l'a float("9e999")corrigé. Ne l'utilisez pas inf = 9e999, vous devez le convertir à partir d'une chaîne.
-infdonne le -Infinity.
isinf
et tellesisnan
que fournies parnumpy
. Voir ma réponse ci-dessous.Réponses:
Cast à partir d'une chaîne en utilisant
float()
:la source
Oui, vous pouvez l'utiliser
numpy
pour cela.la source
math.isnan()
etmath.isinf()
numpy
est une importation assez lourde si tout ce que vous voulez estNaN
ouinf
NaN
ouInf
, celuifrom numpy import nan, inf
qui pourrait exister depuis que cette question a été soulevée.Oui, en fait, il existe plusieurs façons. Quelques-uns fonctionnent sans aucune importation, tandis que d'autres nécessitent
import
, mais pour cette réponse, je limiterai les bibliothèques de l'aperçu à la bibliothèque standard et à NumPy (qui n'est pas une bibliothèque standard mais une bibliothèque tierce très courante).Le tableau suivant résume les façons dont on peut créer un infini pas un nombre ou un infini positif ou négatif
float
:Quelques remarques sur la table:
float
constructeur est en fait insensible à la casse, vous pouvez donc également utiliserfloat("NaN")
oufloat("InFiNiTy")
.cmath
etnumpy
renvoient desfloat
objets Python simples .numpy.NINF
est en fait la seule constante que je connaisse qui ne nécessite pas le-
.Il est possible de créer des NaN et Infinity complexes avec
complex
etcmath
:Les options avec ¹ renvoient une plaine
float
, pas uncomplex
.Oui, il existe - en fait, il existe plusieurs fonctions pour NaN, Infinity et ni Nan ni Inf. Cependant, ces fonctions prédéfinies ne sont pas intégrées, elles nécessitent toujours
import
:Encore quelques remarques:
cmath
etnumpy
fonctionnent également pour les objets complexes, elles vérifieront si la partie réelle ou imaginaire est NaN ou Infinity.numpy
fonctions fonctionnent également pour lesnumpy
tableaux et tout ce qui peut être converti en un (comme les listes, les tuples, etc.)numpy.isposinf
etnumpy.isneginf
.NaN
:pandas.isna
etpandas.isnull
(mais pas seulement NaN, il correspond également àNone
etNaT
)Même s'il n'y a pas de fonctions intégrées, il serait facile de les créer vous-même (j'ai négligé la vérification de type et la documentation ici):
Pour résumer les résultats attendus pour ces fonctions (en supposant que l'entrée est un flottant):
Dans une liste ce n'est pas un problème, vous pouvez toujours y inclure NaN (ou Infinity):
Cependant, si vous souhaitez l'inclure dans un
array
(par exemplearray.array
ounumpy.array
), le type du tableau doit êtrefloat
oucomplex
parce que sinon, il essaiera de le convertir en type de tableaux!la source
math.isnan
ne fonctionne pas avec des nombres complexes. Utilisezmath.isnan(x.real) or math.isnan(x.imag)
plutôt.Lorsque vous utilisez Python 2.4, essayez
Je suis confronté au problème lorsque je portais le simplejson sur un périphérique intégré qui exécutant Python 2.4, l'a
float("9e999")
corrigé. Ne l'utilisez pasinf = 9e999
, vous devez le convertir à partir d'une chaîne.-inf
donne le-Infinity
.la source