Indizierung von numpy-Arrays#
Indizierung ist der Begriff, der für die Auswahl von Einträgen in einem Array verwendet wird, z.B. abhängig von seinem Inhalt. Auch dies ist eine Operation, die wir mit Standard-Listen nicht einfach durchführen können und bei der Numpy sehr nützlich ist.
Als erstes einfaches Beispiel erstellen wir hier ein 1D-Numpy-Array:
import numpy
measurements = numpy.asarray([1, 17, 25, 3, 5, 26, 12])
measurements
array([ 1, 17, 25, 3, 5, 26, 12])
Unser Ziel ist es nun, in diesem Array nur Werte zu erhalten, die größer als ein bestimmter Schwellenwert sind, zum Beispiel 10
. Wenn wir einfache Python-Variablen verwenden, können solche Vergleiche folgendermaßen durchgeführt werden:
a = 5
b = a > 10
b
False
Das Ergebnis ist ein boolescher Wert, der den Wert True
oder False
annimmt. Glücklicherweise können wir dasselbe mit Numpy-Arrays tun:
mask = measurements > 10
mask
array([False, True, True, False, False, True, True])
Anstatt einen einzelnen booleschen Wert zu erhalten, bekommen wir jetzt ein Numpy-Array von booleschen Werten. Wir können dieses Array nun als Maske für unsere Daten verwenden, um ein neues Array zu erhalten, das nur maskierte Werte enthält (True
im Masken-Array). Dafür verwenden wir wieder eckige Klammern (wie bei der Auswahl von Zeilen und Spalten), aber verwenden die Maske anstelle von Indizes:
measurements[mask]
array([17, 25, 26, 12])
Mit Bildern#
Anstatt dieses einfache 1D-Array zu verwenden, können wir dieselbe Operation auf einem ganzen Bild durchführen. Lassen Sie uns das Blobs-Bild erneut importieren:
from skimage.io import imread, imshow
from microfilm.microplot import microshow
image = imread("../../data/blobs.tif")
microshow(image);
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]])
Jetzt erhalten wir ein 2D-Array gefüllt mit booleschen Werten. Wir können es sogar ansehen (weiße Werte sind True
):
microshow(mask);
Und jetzt können wir die Indizierung verwenden, um alle Pixelwerte über unserem Schwellenwert von 100 zu erhalten:
image[mask]
array([112, 152, 184, ..., 152, 128, 112], dtype=uint8)
len(image[mask])
24969
Wir haben 24969 Pixel über dem Schwellenwert.
Übungen#
Erstellen Sie eine neue Maske für alle Pixelwerte über 200.
Wenden Sie die Maske an, um ein neues Array mit Zahlen über 200 zu erhalten.
Berechnen Sie den Durchschnitt aller Pixel über 200.