Indexación de arrays numpy#

La indexación es el término utilizado para seleccionar entradas en un array, por ejemplo, dependiendo de su contenido. De nuevo, esta es una operación que no podemos realizar de manera simple utilizando listas estándar y donde Numpy es muy útil.

Como primer ejemplo simple, creamos aquí un array Numpy 1D:

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

Nuestro objetivo ahora es recuperar en este array solo los valores mayores que un cierto umbral, 10 por ejemplo. Cuando usamos variables simples de Python, tales comparaciones se pueden hacer así:

a = 5
b = a > 10
b
False

El resultado es un valor booleano que toma el valor True o False. Afortunadamente, podemos hacer lo mismo con arrays Numpy:

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

En lugar de obtener un solo valor booleano, ahora obtenemos un array Numpy de booleanos. Ahora podemos aplicar este array como una máscara a nuestros datos para recuperar un nuevo array que solo contiene valores enmascarados (True en el array de máscara). Para esto, usamos nuevamente corchetes (como para seleccionar filas y columnas), pero usamos la máscara en lugar de índices:

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

Con imágenes#

En lugar de usar este simple array 1D, podemos realizar la misma operación en una imagen completa. Importemos la imagen de blobs nuevamente:

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]])

Ahora obtenemos un array 2D lleno de valores booleanos. Incluso podemos verlo (los valores blancos son True):

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

Y ahora podemos hacer indexación para recuperar todos los valores de píxeles por encima de nuestro umbral de 100:

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

Tenemos 24969 píxeles por encima del umbral.

Ejercicios#

Crea una nueva máscara para todos los valores de píxeles por encima de 200.

Aplica la máscara para obtener un nuevo array con números por encima de 200.

Calcula el promedio de todos los píxeles por encima de 200.