HOWTO · Python
Ein 2D-Array in Python kopieren
Dieser Artikel zeigt, wie Sie in Python eine Kopie eines 2D-Arrays erstellen
Auf dieser Seite
Um 2D-Daten in Python zu kopieren, wählen Sie die Operation passend zum Datentyp und zum gewünschten Verhalten beim Teilen von Daten: Verwenden Sie copy() von NumPy für unabhängige Array-Daten, copy.deepcopy() für eine verschachtelte Liste, deren innere Listen ebenfalls unabhängig sein sollen, oder eine flache Kopie, wenn das Teilen innerer Objekte beabsichtigt ist. Eine NumPy-view() ist ein eigenes Array-Objekt, das seine zugrunde liegenden Daten mit dem Original teilt.
Ein 2D-Array ordnet Werte in Zeilen und Spalten an. In einer Python-Liste aus Listen bildet jede innere Liste eine Zeile. Zwei Indizes wählen zuerst eine Zeile und anschließend ein Element in dieser Zeile aus, etwa mit data[row_index][column_index].
Eine Kopie von 2D-Arrays mit der NumPy-Methode copy() erstellen
Bei einem NumPy-ndarray rufen Sie dessen Methode copy() auf, um ein Array mit eigenen Daten zu erstellen. In diesem Beispiel ändern Sie einen Wert in der Kopie und betrachten anschließend beide Arrays:
import numpy as np
original = np.array([[23, 34, 45], [24, 45, 78]])
copied = original.copy()
copied[0, 2] = 65
print("Copy:", copied.tolist())
print("Original:", original.tolist())
Copy: [[23, 34, 65], [24, 45, 78]]
Original: [[23, 34, 45], [24, 45, 78]]
Die Zuweisung ändert copied; das ursprüngliche Array behält seine Anfangswerte. Diese Methode eignet sich direkt, wenn Sie numerische Array-Daten unabhängig bearbeiten möchten. NumPy-Arrays können auch Python-Objekte enthalten. Beim Kopieren eines Arrays mit dem Datentyp object wird zwar dessen Datenpuffer kopiert, die darin gespeicherten Python-Objekte werden jedoch nicht rekursiv kopiert.
Die Ausgabebezeichnungen „Copy:“ und „Original:“ bleiben im unveränderten Beispiel Englisch. Sie kennzeichnen die Ausgabe der Kopie beziehungsweise des ursprünglichen Arrays.
Eine Kopie eines 2D-Arrays mit der Funktion copy.deepcopy() erstellen
Bei einer verschachtelten Python-Liste kopiert copy.deepcopy() die Listen und ihre Inhalte rekursiv. Das ist wichtig, wenn eine innere Liste nach dem Kopieren verändert werden könnte:
import copy
original = [["red", "blue"], ["green", "gold"]]
copied = copy.deepcopy(original)
copied[0].append("white")
print("Copy:", copied)
print("Original:", original)
Copy: [['red', 'blue', 'white'], ['green', 'gold']]
Original: [['red', 'blue'], ['green', 'gold']]
Die neue äußere Liste und ihre inneren Listen sind vom Original getrennt. Daher verändert das Anhängen eines Elements an eine innere Liste in copied das Objekt original nicht. deepcopy() ist für verschachtelte, veränderliche Daten nützlich. Bei großen oder benutzerdefinierten Objekten sollten Sie abwägen, ob es sinnvoll ist, jedes referenzierte Objekt rekursiv zu kopieren.
Eine flache Kopie eines 2D-Arrays in Python erstellen
Eine flache Kopie erstellt einen neuen äußeren Container, behält aber die Verweise auf die inneren Objekte des Originals bei. Bei einer verschachtelten Liste verhalten sich copy.copy() und die Methode list.copy() des äußeren Listenelements auf diese Weise:
import copy
original = [["red", "blue"], ["green", "gold"]]
copied = copy.copy(original)
copied[0].append("white")
print("Copy:", copied)
print("Original:", original)
Copy: [['red', 'blue', 'white'], ['green', 'gold']]
Original: [['red', 'blue', 'white'], ['green', 'gold']]
Hier verweisen beide äußeren Listen auf dieselbe erste innere Liste. Deshalb ist das angehängte Element in beiden sichtbar. Wenn Sie dagegen ein Element in der kopierten äußeren Liste ersetzen, zum Beispiel mit copied[0] = ["black"], ändert sich nur der Verweis in dieser äußeren Liste. Verwenden Sie copy.deepcopy(), wenn auch die inneren Listen unabhängig sein sollen.
NumPys view() unterscheidet sich von einer flachen Kopie einer verschachtelten Python-Liste. Die Methode gibt ein eigenes ndarray-Objekt zurück, das die Daten des ursprünglichen Arrays teilt. Daher sind Zuweisungen über die Ansicht auch in den Werten des Originals sichtbar. Für unabhängige NumPy-Daten verwenden Sie stattdessen ndarray.copy(). Objektidentität und das Teilen von Daten sind zwei verschiedene Fragen: Zwei Arrays können verschiedene Objekte sein und dennoch dieselben zugrunde liegenden Werte bereitstellen.
import numpy as np
original = np.array([[24, 23, 25], [32, 43, 54]])
view = original.view()
view[0, 2] = 100
print("View:", view.tolist())
print("Original:", original.tolist())
View: [[24, 23, 100], [32, 43, 54]]
Original: [[24, 23, 100], [32, 43, 54]]