Accès rapide :
Introduction
La valeur nan
Tester correctement nan
Infini positif et infini négatif
Remplacer les valeurs spéciales
Calculer malgré les valeurs manquantes
Conserver seulement les valeurs finies
Introduction aux tableaux masqués
Les données réelles contiennent parfois des valeurs manquantes, invalides ou infinies. NumPy fournit des valeurs spéciales pour représenter ces situations, ainsi que des fonctions pour les détecter et les traiter correctement.
La valeur np.nan signifie Not a Number. Elle est souvent utilisée pour représenter
une valeur numérique manquante.
1 2 3 4 5 6 |
import numpy as np values = np.array([10.0, np.nan, 30.0]) print(values) print(values.mean()) |
[10. nan 30.] nan
Une seule valeur nan suffit à rendre la moyenne classique invalide.
Une particularité de nan est qu'il n'est pas égal à lui-même. Il ne faut donc pas utiliser
une comparaison classique pour le détecter.
1 2 3 4 |
import numpy as np print(np.nan == np.nan) print(np.isnan(np.nan)) |
False True
NumPy sait aussi représenter l'infini positif et l'infini négatif avec np.inf et
-np.inf. Les fonctions isnan, isinf et isfinite
permettent d'analyser un tableau.
1 2 3 4 5 6 7 |
import numpy as np values = np.array([1.0, np.nan, np.inf, -np.inf, 5.0]) print(np.isnan(values)) print(np.isinf(values)) print(np.isfinite(values)) |
[False True False False False] [False False True True False] [ True False False False True]
La fonction nan_to_num permet de remplacer les valeurs manquantes et infinies par des
valeurs numériques choisies.
1 2 3 4 5 6 |
import numpy as np values = np.array([1.0, np.nan, np.inf, -np.inf, 5.0]) clean = np.nan_to_num(values, nan=0.0, posinf=999.0, neginf=-999.0) print(clean) |
[ 1. 0. 999. -999. 5.]
Certaines fonctions statistiques existent en version qui ignore les valeurs nan. C'est le
cas de nanmean, nanmin ou nanmax.
1 2 3 4 5 6 |
import numpy as np measures = np.array([12.0, np.nan, 15.0, 9.0]) print(np.mean(measures)) print(np.nanmean(measures)) |
nan 12.0
Pour certains traitements, la solution la plus simple consiste à retirer les valeurs non finies.
1 2 3 4 5 6 |
import numpy as np values = np.array([1.0, np.nan, np.inf, -np.inf, 5.0]) finite = values[np.isfinite(values)] print(finite) |
[1. 5.]
Les tableaux masqués permettent de conserver les données d'origine tout en indiquant que certaines valeurs doivent être ignorées dans les calculs.
1 2 3 4 5 6 7 |
import numpy as np data = np.array([10, -1, 20, -1, 30]) masked = np.ma.masked_equal(data, -1) print(masked) print(masked.mean()) |
[10 -- 20 -- 30] 20.0
Ici, la valeur -1 représente une donnée invalide. Elle reste présente dans le tableau,
mais elle n'est pas prise en compte dans le calcul de la moyenne.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :