In Python können Sie Slice [start:stop:step] verwenden, um einen Teil eines Sequenzobjekts auszuwählen, z. B. eine Liste, einen String oder eine Tupel, um einen Wert zu erhalten oder einen anderen Wert zuzuweisen.
Es ist auch möglich, ein Subarray durch Slicen für das NumPy-Array numpy.ndarray auszuwählen und einen Wert zu extrahieren oder einen anderen Wert zuzuweisen.
Dieser Artikel enthält Folgendes:
- Grundlagen des Schneidens
- Sektor für numpy.one-dimensional darray
- Slice für mehrdimensionales numpy.ndarray
- Ansichten und Kopien
- Mit eleganter Indexierung
Im following Artikel erfahren Sie, wie Sie Zeilen und Spalten extrahieren, sterben sterben Bedingungen erfüllen.
Grundlagen des Schneidens
In Python können Sie Slice [start:stop:step] verwenden, um einen Teil eines Sequenzobjekts auszuwählen, z. B. eine Liste, einen String oder eine Tupel, um einen Wert zu erhalten oder einen anderen Wert zuzuweisen.
import numpy as np
l = list(range(10))
print(l)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(l[4:8])
# [4, 5, 6, 7]
print(l[-5:-2])
# [5, 6, 7]
print(l[::-1])
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Slicing ist eine Standardfunktion in Python. Weitere Informationen finden Sie im folgenden Artikel.
Sektor für numpy.one-dimensional darray
Holen Sie sich ein Unterarray
Das Segment für das eindimensionale numpy.ndarray ist dasselbe wie das klassische Python-Segment wie im obigen Beispiel.
a = np.arange(10)
print(a)
# [0 1 2 3 4 5 6 7 8 9]
print(a[4:8])
# [4 5 6 7]
print(a[-5:-2])
# [5 6 7]
print(a[::-1])
# [9 8 7 6 5 4 3 2 1 0]
Weisen Sie einen anderen Wert zu
Das Segmentzuweisungsverhalten ist für list und numpy.ndarray unterschiedlich.
Die Zuordnung der Liste nach Sektoren can SIE dem following Artikel entnehmen. Die Anzahl der pro Slice ausgewählten Elemente und die Anzahl der zuzuweisenden Elemente müssen nicht übereinstimmen.
In numpy.ndarray wird der Wert auf der rechten Seite per Streaming umgewandelt und zugewiesen.
Wenn die rechte Seite ein Skalarwert ist, werden alle vom Segment selected Elemente durch diesen Skalarwert ersetzt. Wenn die rechte Seite ein eindimensionales Array ist, wird es durch dieses Array ersetzt.
a[3:6] = 100
print(a)
# [ 0 1 2 100 100 100 6 7 8 9]
a[3:6] = [100, 200, 300]
print(a)
# [ 0 1 2 100 200 300 6 7 8 9]
Wenn beim Zuweisen eines Arrays die Anzahl der zuzuweisenden Elemente im Array und die Anzahl der im Slice ausgewählten Elemente nicht übereinstimmen, wird ein ValueError ausgelöst.
# a[3:6] = [100, 200, 300, 400]
# ValueError: cannot copy sequence with size 4 to array axis with dimension 3
Gleiches gilt für Sektoren, für die der Schritt angegeben ist.
a = np.arange(10)
print(a)
# [0 1 2 3 4 5 6 7 8 9]
print(a[2:8:2])
# [2 4 6]
a[2:8:2] = 100
print(a)
# [ 0 1 100 3 100 5 100 7 8 9]
a[2:8:2] = [100, 200, 300]
print(a)
# [ 0 1 100 3 200 5 300 7 8 9]
Slice für mehrdimensionales numpy.ndarray
Für mehrdimensionale numpy.ndarray can Teile jeder Dimension durch Kommas getrennt Werden.
Nehmen Sie das folgende zweidimensionale Array als Beispiel.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
Holen Sie sich ein Subarray
Geben Sie Segmente für jede Dimension durch Kommas getrennt an.
print(a[1:, 1:3])
# [[ 5 6]
# [ 9 10]]
Zeilen auswählen
Mit: can SIE Zeilen auswählen. In diesem Fall kann die Endung: weggelassen werden.
print(a[1:, :])
# [[ 4 5 6 7]
# [ 8 9 10 11]]
print(a[1:])
# [[ 4 5 6 7]
# [ 8 9 10 11]]
Wenn SIE bei der Auswahl Einer Zeile den Index durch den Skalarwert anstelle des Segments angeben, WIRD er als eindimensionales Array ausgewählt, aber Wenn SIE eine Zeile durch das Segment auswählen, WIRD er als zweidimensionales Array ausgewählt .
print(a[1])
# [4 5 6 7]
print(a[1].shape)
# (4,)
print(a[1:2])
# [[4 5 6 7]]
print(a[1:2].shape)
# (1, 4)
Seien Sie vorsichtig in Fällen, in denen die Form wichtig ist, wie z. B. bei Matrixoperationen.
Spalten auswählen
Gleiches gilt für die Spaltenauswahl. In diesem Fall kann das erste: nicht weggelassen werden.
print(a[:, 1:3])
# [[ 1 2]
# [ 5 6]
# [ 9 10]]
print(a[:, 1])
# [1 5 9]
print(a[:, 1].shape)
# (3,)
print(a[:, 1:2])
# [[1]
# [5]
# [9]]
print(a[:, 1:2].shape)
# (3, 1)
Sie können … if : wiederholt verwenden. Siehe folgenden Artikel.
Weisen Sie einen anderen Wert zu
Wie bei eindimensionalen numpy.ndarray WIRD bei der Zuweisung zu einem mehrdimensionalen numpy.ndarray der Wert auf der rechten Seite gecastet und einem zugewiesen.
Beim Zuweisen eines Arrays wird ein ValueError ausgelöst, wenn die Anzahl der zuzuweisenden Array-Elemente und die Anzahl der entsprechenden Elemente, die vom Slice ausgewählt Werden, nicht übereinstimmen.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a[1:, 1:3])
# [[ 5 6]
# [ 9 10]]
a[1:, 1:3] = 100
print(a)
# [[ 0 1 2 3]
# [ 4 100 100 7]
# [ 8 100 100 11]]
a[1:, 1:3] = [100, 200]
print(a)
# [[ 0 1 2 3]
# [ 4 100 200 7]
# [ 8 100 200 11]]
a[1:, 1:3] = [[100, 200], [300, 400]]
print(a)
# [[ 0 1 2 3]
# [ 4 100 200 7]
# [ 8 300 400 11]]
Gleiches gilt für Sektoren, für die der Schritt angegeben ist.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a[1:, ::2])
# [[ 4 6]
# [ 8 10]]
a[1:, ::2] = 100
print(a)
# [[ 0 1 2 3]
# [100 5 100 7]
# [100 9 100 11]]
a[1:, ::2] = [100, 200]
print(a)
# [[ 0 1 2 3]
# [100 5 200 7]
# [100 9 200 11]]
a[1:, ::2] = [[100, 200], [300, 400]]
print(a)
# [[ 0 1 2 3]
# [100 5 200 7]
# [300 9 400 11]]
Ansichten und Kopien
Das durch das Slice extrahierte Subarray ist eine Ansicht des ursprünglichen Arrays, und das Ändern der Elemente des Subarrays ändert auch die Elemente des ursprünglichen Arrays.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
a_slice = a[1:, 1:3]
print(a_slice)
# [[ 5 6]
# [ 9 10]]
a_slice[0, 0] = 100
print(a_slice)
# [[100 6]
# [ 9 10]]
print(a)
# [[ 0 1 2 3]
# [ 4 100 6 7]
# [ 8 9 10 11]]
Sie können mit copy() eine Kopie eines Subarrays erstellen. Das Ändern der Elemente der Kopie ändert nicht sterben Elemente des ursprünglichen Arrays.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
a_slice_copy = a[1:, 1:3].copy()
print(a_slice_copy)
# [[ 5 6]
# [ 9 10]]
a_slice_copy[0, 0] = 100
print(a_slice_copy)
# [[100 6]
# [ 9 10]]
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
Weitere Informationen zu Ansichten und Kopien in numpy.ndarray finden Sie im following Artikel.
Mit eleganter Indexierung
In NumPy können Sie mithilfe einer Liste von Indizes ein Unterarray von numpy.ndarray auswählen.
Sub-Arrays können ausgewählt werden, damit ausgeklügeltes Indizieren und Schneiden kombiniert werden.
a = np.arange(12).reshape((3, 4))
print(a)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(a[[0, 2], 1:3])
# [[ 1 2]
# [ 9 10]]
a[[0, 2], 1:3] = 100
print(a)
# [[ 0 100 100 3]
# [ 4 5 6 7]
# [ 8 100 100 11]]
a[[0, 2], 1:3] = [100, 200]
print(a)
# [[ 0 100 200 3]
# [ 4 5 6 7]
# [ 8 100 200 11]]
a[[0, 2], 1:3] = [[100, 200], [300, 400]]
print(a)
# [[ 0 100 200 3]
# [ 4 5 6 7]
# [ 8 300 400 11]]
Beachten Sie, dass das durch elegante Indizierung gesicherte Subarray eine Kopie und keine Ansicht ist.
a_subset = a[[0, 2], 1:3]
print(a_subset)
# [[100 200]
# [300 400]]
a_subset[0, 0] = -1
print(a_subset)
# [[ -1 200]
# [300 400]]
print(a)
# [[ 0 100 200 3]
# [ 4 5 6 7]
# [ 8 300 400 11]]