5  Slicing

5.1 Normales Slicing mit Zahlenwerten

Auswahl der jeweiligen Achsen für NumPy-Arrays von verschiedener Dimension, dargestellt durch gestapelte Blöcke.
Abbildung 5.1: Ansprechen der einzelnen Achsen für den ein-, zwei- und dreidimensionallen Fall inkl. jeweiligem Beispiel

Möchte man Daten innerhalb eines Arrays auswählen, so geschieht das in der Form:

  1. array[a] wobei ein einzelner Wert an Position a ausgegeben wird.
  2. array[a:b] wobei alle Werte von Position a bis Position b-1 ausgegeben werden.
  3. array[a:b:c] wobei die Werte von Position a bis Position b-1 mit einer Schrittweite von c ausgegeben werden.
liste = np.array([1, 2, 3, 4, 5, 6])
# Auswählen des ersten Elements
liste[0]
np.int64(1)
# Auswählen des letzten Elements
liste[-1]
np.int64(6)
# Auswählen einer Reihe von Elementen
liste[1:4]
array([2, 3, 4])

Für zweidimensionale Arrays wählt man mit einer zweiten, durch ein Komma von der ersten getrennten Zahl die zweite Dimension aus.

matrix = np.array([[1, 2, 3], [4, 5, 6]])
# Auswählen eines Elements
matrix[1,1]
np.int64(5)

Für dreidimensionale Arrays wählt man mit einer weiteren, ebenfalls durch ein Komma getrennten Zahl die dritte Dimension aus. Dabei wird diese jedoch an die erste Stelle gesetzt.

matrix_3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(matrix_3d)
[[[ 1  2  3]
  [ 4  5  6]]

 [[ 7  8  9]
  [10 11 12]]]
# Auswählen eines Elements
matrix_3d[1,0,2]
np.int64(9)

5.2 Slicing mit logischen Werten (boolesche Masken)

Beim logischen Slicing wird eine boolesche Maske verwendet, um bestimmte Elemente eines Arrays auszuwählen. Die Maske ist ein Array gleicher Länge wie das Original, das aus den Werten True oder False besteht.

# Erstellen wir ein Beispiel Array
a = np.array([1, 2, 3, 4, 5, 6])

# Erstellen der Maske
maske = a > 3

print(maske)
[False False False  True  True  True]

Wir erhalten also ein Array mit boolschen Werten. Verwenden wir diese Maske nun zum slicen, erhalten wir alle Werte an den Stellen, an denen die Maske den Wert True besitzt.

# Anwenden der Maske
print(a[maske])
[4 5 6]

Mehrere Masken können mit dem Operator * zu einem logischen UND verknüpft werden.

# 2 Masken
gerade_zahlen = a % 2 == 0
kleiner_3 = a < 3
print(gerade_zahlen, kleiner_3, sep = '\n')

# logisches UND beider Masken
print(a[kleiner_3 * gerade_zahlen])
[False  True False  True False  True]
[ True  True False False False False]
[2]
Warnung

Das Verwenden von booleschen Arrays ist nicht für native Python-Listen möglich. Hier muss durch die Liste iterriert werden.

a = [1, 2, 3, 4, 5, 6]
ergebnis = [x for x in a if x > 3]
print(ergebnis) 
[4, 5, 6]

Wählen Sie die farblich markierten Bereiche aus dem Array “matrix” mit den eben gelernten Möglichkeiten des Array-Slicing aus.

Grafische Darstellung der in der folgenden Code-Zelle erstellten Matrix.

matrix = np.array([
    [2, 11, 18, 47, 33, 48, 9, 31, 8, 41],
    [55, 1, 8, 3, 91, 56, 17, 54, 23, 12],
    [19, 99, 56, 72, 6, 13, 34, 16, 77, 56],
    [37, 75, 67, 5, 46, 98, 57, 19, 14, 7],
    [4, 57, 32, 78, 56, 12, 43, 61, 3, 88],
    [96, 16, 92, 18, 50, 90, 35, 15, 36, 97],
    [75, 4, 38, 53, 1, 79, 56, 73, 45, 56],
    [15, 76, 11, 93, 87, 8, 2, 58, 86, 94],
    [51, 14, 60, 57, 74, 42, 59, 71, 88, 52],
    [49, 6, 43, 39, 17, 18, 95, 6, 44, 75]
])
  • Rot: matrix[1,3]
  • Grün: matrix[4:6,2:6]
  • Pink: matrix[:,7]
  • Orange: matrix[7,:5]
  • Blau: matrix[-1,-1]