> Modules non standards > numpy > Masked arrays
Masked arrays
masked array :
- c'est une array dont certaines valeurs sont non définies (masquées) car par exemple correspondant à des données invalides.
- c'est en fait une array de valeur + un masque sous la forme d'une array de booléens qui sont vrais quand la valeur doit être considérée comme masquée. Le masque peut aussi être simplement False si aucune valeur n'est masquée.
- les valeurs masquées ne sont pas utilisées dans les calculs.
Définition d'une masked array :
- am = numpy.ma.masked_array([1, 2, 3, 4], mask = [0, 0, 1, 0]) : la 3ème valeur est masquée.
- si on calcule la somme a.sum(), on obtient alors 7 (valeur 3 ignorée).
- si on avait définit l'array sous cette forme numpy.array([1, 2, numpy.nan, 4]), pour la somme, on aurait obtenu nan !
- am = numpy.ma.asarray(a) : convertit une array en masked array avec aucun élément masqué.
- si on a une array avec des nan, on peut la convertir en masked array : a = numpy.array([1, 2, numpy.nan, 4]); am = numpy.ma.masked_array(a, numpy.isnan(a)) : am est une masked array avec la 3ème valeur masquée.
- on peut définir une masked array en 2d à partir d'une array et d'un masque :
a = numpy.array([[1, 2], [3, 4]])
m = numpy.array([[True, False], [False, True]])
am = numpy.ma.masked_array(a, m)
alors ma vaut :
[[-- 2]
[3 --]]
Accès aux données et au masque : si am est une masked array :
- am.data : accède aux données non masquées. On peut faire aussi numpy.ma.getdata(am).
- am.mask : accède aux masque (array de booléens), mais attention si aucune donnée masquée, renvoie simplement la valeur False. On peut faire aussi numpy.ma.getmask(am).
- numpy.ma.getmaskarray(am) : renvoie une array de booléens dans tous les cas, même si aucune donnée masquée (dans ce cas, c'est une array avec que des False).
Masquage de certaines valeurs :
- on suppose ici que am est une masked array : am = numpy.ma.masked_array([1, 2, 3, 4]).
- am[0] = numpy.ma.masked : masquage de la valeur d'indice 0.
- am[0:2] = numpy.ma.masked : masquage des valeurs d'indices 0 et 1.
- on peut au contraire démasquer certaines valeurs simplement en fixant une nouvelle valeur : am[0] = 5.
- am = numpy.ma.fix_invalid(a) : retourne une array masquée où toutes les valeurs invalides (nan ou infinies) ont été masquées (peut agir sur une masked array ou un array normale).
- a = numpy.array([1, 2, 3, 4]); am = numpy.ma.masked_equal(a, 3) : renvoie une masked array où toutes les valeurs égales à 3 sont masquées, ici [1, 2, --, 4]. Idem avec masked_not_equal.
- am = numpy.ma.masked_greater(a, 3) renvoie une masked array où toutes les valeurs > 3 sont masquées, donne ici [1, 2, 3, --]. Idem avec masked_less.
- am = numpy.ma.masked_greater_equal(a, 3) renvoie une masked array où toutes les valeurs >= 3 sont masquées, donne ici [1, 2, --, --]. Idem avec masked_less_equal.
- a = numpy.array([1, 2, 3, 4]); am = numpy.ma.masked_inside(a, 2, 3) : renvoie une masked array où toutes les valeurs entre 2 et 3 inclus sont masquées, donne ici [1, --, --, 4].
- a = numpy.array([1, 2, 3, 4]); am = numpy.ma.masked_outside(a, 2, 3) : renvoie une masked array où toutes les valeurs >= 2 ou >= 3 sont masquées, donne ici [--, 2, 3, --],.
- a = numpy.array([1, 2, 3, 4]); am = numpy.ma.masked_where(numpy.logical_or(a >= 3, a == 1), a) : renvoie une masked array où toutes les valeurs qui vérifient la condition sont masquées, donne ici [--, 2, --, --].
Pour remplir les valeurs masquées : ma = numpy.ma.masked_array([1, 2, 3, 4], mask = [0, 0, 1, 0]); a = ma.filled(0) : renvoie une array non masquée avec toutes les valeurs masquées remplacées par la valeur 0.
Opérations sur les masked arrays :
- les données masquées ne participent pas aux opérations. Attention : les données derrière les données masquées ne doivent pas être utilisées car les opérations ne sont pas appliquées correctement dessus !
- Exemple de l'addition de 2 masked arrays :
am1 = numpy.ma.masked_array([1, 2, 3, 4], mask = [0, 0, 1, 0])
am2 = numpy.ma.masked_array([5, 6, 7, 8], mask = [0, 1, 0, 0])
am1 + am2
donne la masked array : [6, --, --, 12] (-- pour les valeurs masquées).
- on peut effectuer des calculs sur les masked array sans se préoccuper des domaines de définition des fonctions : toutes les valeurs invalides seront masquées. Par exemple, am = numpy.ma.masked_array([1, 2, 0, -1]); ma2 = numpy.sqrt(1 / am) donne [1.0, 0.0, --, --].
Copyright python-simple.com
programmer en python, tutoriel python, graphes en python, Aymeric Duclert