Indexation des tableaux numpy#

L’indexation est le terme utilisé pour sélectionner des entrées dans un tableau, par exemple en fonction de son contenu. C’est encore une opération que nous ne pouvons pas effectuer de manière simple en utilisant des listes standard et où Numpy est très utile.

Comme premier exemple simple, nous créons ici un tableau Numpy 1D :

import numpy
measurements = numpy.asarray([1, 17, 25, 3, 5, 26, 12])
measurements
array([ 1, 17, 25,  3,  5, 26, 12])

Notre objectif est maintenant de récupérer dans ce tableau uniquement les valeurs supérieures à un certain seuil, 10 par exemple. Lorsque nous utilisons de simples variables Python, de telles comparaisons peuvent être faites comme ceci :

a = 5
b = a > 10
b
False

Le résultat est une valeur booléenne qui prend la valeur True ou False. Heureusement, nous pouvons faire la même chose avec les tableaux Numpy :

mask = measurements > 10
mask
array([False,  True,  True, False, False,  True,  True])

Au lieu d’obtenir une seule valeur booléenne, nous obtenons maintenant un tableau Numpy de booléens. Nous pouvons maintenant utiliser ce tableau comme un masque pour nos données afin de récupérer un nouveau tableau qui ne contient que les valeurs masquées (True dans le tableau de masque). Pour cela, nous utilisons à nouveau des crochets (comme pour sélectionner des lignes et des colonnes), mais en utilisant le masque au lieu des indices :

measurements[mask]
array([17, 25, 26, 12])

Avec des images#

Au lieu d’utiliser ce simple tableau 1D, nous pouvons effectuer la même opération sur une image entière. Importons à nouveau l’image des taches :

from skimage.io import imread, imshow
from microfilm.microplot import microshow
image = imread("../../data/blobs.tif")
microshow(image);
../_images/86f9061a06b2f20b3ed3ddd41075e98754f485f36a8cd0d44daae4545e43ad8f.png
mask = image > 100
mask
array([[False, False, False, ...,  True,  True,  True],
       [False, False, False, ...,  True,  True,  True],
       [False, False, False, ...,  True,  True,  True],
       ...,
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False],
       [False, False, False, ..., False, False, False]])

Nous obtenons maintenant un tableau 2D rempli de valeurs booléennes. Nous pouvons même le visualiser (les valeurs blanches sont True) :

microshow(mask);
../_images/29271299c49d9eb4cca588ae204cbd4d5cd46e5999a5edbe8d8a97abe9ac905c.png

Et maintenant, nous pouvons faire de l’indexation pour récupérer toutes les valeurs de pixels au-dessus de notre seuil de 100 :

image[mask]
array([112, 152, 184, ..., 152, 128, 112], dtype=uint8)
len(image[mask])
24969

Nous avons 24969 pixels au-dessus du seuil.

Exercices#

Créez un nouveau masque pour toutes les valeurs de pixels supérieures à 200.

Appliquez le masque pour récupérer un nouveau tableau avec des nombres supérieurs à 200.

Calculez la moyenne de tous les pixels supérieurs à 200.