Est-il possible de donner à un élément d'un tableau la valeur suivante NaN
en Python ?
En outre, est-il possible de définir une variable à +/- l'infini ? Si oui, existe-t-il une fonction permettant de vérifier si un nombre est infini ou non ?
Est-il possible de donner à un élément d'un tableau la valeur suivante NaN
en Python ?
En outre, est-il possible de définir une variable à +/- l'infini ? Si oui, existe-t-il une fonction permettant de vérifier si un nombre est infini ou non ?
Cela m'apprendra à ne pas me lancer dans une boutade avant d'avoir lu la question une seconde fois ! Désolé ! Cela dit, ça ne fait pas de mal de le dire quand même parce que c'est un piège facile à tomber, NaN != NaN
Oui, vous pouvez utiliser numpy
pour ça.
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
Est-il possible de définir un nombre à NaN ou à l'infini ?
Oui, en fait, il y a plusieurs façons de procéder. Quelques-unes fonctionnent sans aucune importation, tandis que d'autres requièrent import
Cependant, pour cette réponse, je limiterai les bibliothèques dans 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 non-nombre ou un infini positif ou négatif. float
:
result NaN Infinity -Infinity
module
built-in float("nan") float("inf") -float("inf")
float("infinity") -float("infinity")
float("+inf") float("-inf")
float("+infinity") float("-infinity")
math math.nan math.inf -math.inf
cmath cmath.nan cmath.inf -cmath.inf
numpy numpy.nan numpy.PINF numpy.NINF
numpy.NaN numpy.inf -numpy.inf
numpy.NAN numpy.infty -numpy.infty
numpy.Inf -numpy.Inf
numpy.Infinity -numpy.Infinity
Quelques remarques à la table :
float
est en fait insensible à la casse, vous pouvez donc également utiliser float("NaN")
o float("InFiNiTy")
.cmath
y numpy
les constantes renvoient du Python pur float
objets.numpy.NINF
est en fait la seule constante que je connaisse qui ne nécessite pas l'option -
.Il est possible de créer des NaN et Infini complexes avec complex
y cmath
:
result NaN+0j 0+NaNj Inf+0j 0+Infj
module
built-in complex("nan") complex("nanj") complex("inf") complex("infj")
complex("infinity") complex("infinityj")
cmath cmath.nan ¹ cmath.nanj cmath.inf ¹ cmath.infj
Les options avec ¹ retournent un simple float
et non un complex
.
existe-t-il une fonction permettant de vérifier si un nombre est infini ou non ?
Oui, il existe - en fait, il y a plusieurs fonctions pour NaN, Infini, et ni Nan ni Inf. Cependant, ces fonctions prédéfinies ne sont pas intégrées, elles nécessitent toujours une fonction import
:
for NaN Infinity or not NaN and
-Infinity not Infinity and
module not -Infinity
math math.isnan math.isinf math.isfinite
cmath cmath.isnan cmath.isinf cmath.isfinite
numpy numpy.isnan numpy.isinf numpy.isfinite
Encore une fois, quelques remarques :
cmath
y numpy
fonctionnent également pour les objets complexes, elles vérifient si la partie réelle ou imaginaire est NaN ou Infini.numpy
fonctionnent également pour numpy
les tableaux et tout ce qui peut être converti en un tableau (comme les listes, les tuple, etc.)numpy.isposinf
y numpy.isneginf
.NaN
: pandas.isna
y pandas.isnull
(mais pas seulement NaN, il correspond aussi à None
y NaT
)Même s'il n'y a pas de fonctions intégrées, il serait facile de les créer soi-même (j'ai négligé la vérification du 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):
return not (isnan(value) or isinf(value))
Pour résumer les résultats attendus pour ces fonctions (en supposant que l'entrée est un flottant) :
input NaN Infinity -Infinity something else
function
isnan True False False False
isinf False True True False
isfinite False False False True
Est-il possible de donner la valeur NaN à un élément d'un tableau en Python ?
Dans une liste, ce n'est pas un problème, vous pouvez toujours y inclure NaN (ou Infini) :
>>> [math.nan, math.inf, -math.inf, 1] # python list
[nan, inf, -inf, 1]
Cependant, si vous voulez l'inclure dans un array
(par exemple array.array
o numpy.array
) alors le type du tableau doit être float
o complex
parce qu'autrement, il essaiera de le convertir en type de tableau !
>>> import numpy as np
>>> float_numpy_array = np.array([0., 0., 0.], dtype=float)
>>> float_numpy_array[0] = float("nan")
>>> float_numpy_array
array([nan, 0., 0.])
>>> import array
>>> float_array = array.array('d', [0, 0, 0])
>>> float_array[0] = float("nan")
>>> float_array
array('d', [nan, 0.0, 0.0])
>>> integer_numpy_array = np.array([0, 0, 0], dtype=int)
>>> integer_numpy_array[0] = float("nan")
ValueError: cannot convert float NaN to integer
Lorsque vous utilisez Python 2.4, essayez
inf = float("9e999")
nan = inf - inf
Je suis confronté à un problème lorsque je portais le simplejson sur un appareil embarqué qui utilise Python 2.4, float("9e999")
C'est réparé. N'utilisez pas inf = 9e999
vous devez le convertir à partir d'une chaîne de caractères. -inf
donne le -Infinity
.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
4 votes
stackoverflow.com/questions/944700 vous indique comment vérifier les NaN. Pour Inf et -Inf, vous pouvez tester avec == mais cela ne fonctionne pas pour NaN à cause des règles IEEE754 pour NaN.
0 votes
Je pense que le moyen le plus fiable est d'utiliser des fonctions appropriées comme
isinf
yisnan
conformément aux dispositions de lanumpy
. Voir ma réponse ci-dessous.