Kopien und Ansichten in NumPy

Eine Kopie ist eine vollständige Kopie der Daten. Wenn wir die Kopie ändern, wirkt sich das nicht auf die Originaldaten aus; sie befinden sich nicht an derselben physischen Speicherstelle.

Eine Ansicht ist ein Alias oder eine Referenz auf die Daten. Über diesen Alias oder diese Referenz können Sie auf die Originaldaten zugreifen und sie bearbeiten, aber es wird keine Kopie der Originaldaten erstellt. Wenn wir die Ansicht ändern, wirkt sich das auf die Originaldaten aus; sie befinden sich an derselben physischen Speicherstelle.

Ansichten treten im Allgemeinen in den folgenden Fällen auf:

  • 1. NumPy-Slice-Operationen geben eine Ansicht der Originaldaten zurück.
  • 2. Der Aufruf der ndarray-Funktion view() erzeugt eine Ansicht.

Kopien treten im Allgemeinen in den folgenden Fällen auf:

  • Python-Sequenz-Slicing-Operationen und der Aufruf der Funktion deepCopy().
  • Der Aufruf der ndarray-Funktion copy() erzeugt eine Kopie.

Keine Kopie

Eine einfache Zuweisung erstellt keine Kopie des Array-Objekts. Stattdessen verwendet sie dieselbe id() wie das ursprüngliche Array, um darauf zuzugreifen. id() gibt eine generische Kennung für ein Python-Objekt zurück, ähnlich einem Zeiger in C.

Darüber hinaus wirken sich Änderungen an einem Array auf das andere Array aus. Wenn Sie beispielsweise die Form eines Arrays ändern, ändert sich auch die Form des anderen Arrays.

Beispiel

import numpy as np a = np.arange(6) print ('Unser Array ist:') print (a) print ('Rufen Sie die Funktion id() auf:') print (id(a)) print ('Weise a b zu:') b = a print (b) print ('b hat dieselbe id():') print (id(b)) print ('Ändere die Form von b:') b.shape = 3,2 print (b) print ('Die Form von a wird ebenfalls geändert:') print (a)

Das Ausgabeergebnis ist:

我们的数组是:
[0 1 2 3 4 5]
调用 id() 函数:
4349302224
a 赋值给 b:
[0 1 2 3 4 5]
b 拥有相同 id():
4349302224
修改 b 的形状:
[[0 1]
 [2 3]
 [4 5]]
a 的形状也修改了:
[[0 1]
 [2 3]
 [4 5]]

Ansicht oder flache Kopie

Die Methode ndarray.view() erstellt ein neues Array-Objekt. Das Ändern der Dimensionen des von dieser Methode erstellten neuen Arrays ändert nicht die Dimensionen der Originaldaten.

Beispiel

import numpy as np # Zunächst ist a ein 3X2-Array a = np.arange(6).reshape(3,2) print ('Array a:') print (a) print ('Erstelle eine Ansicht von a:') b = a.view() print (b) print ('Die id() der beiden Arrays ist unterschiedlich:') print ('id() von a:') print (id(a)) print ('id() von b:' ) print (id(b)) # Das Ändern der Form von b verändert a nicht b.shape = 2,3 print ('Form von b:') print (b) print ('Form von a:') print (a)

Das Ausgabeergebnis ist:

数组 a:
[[0 1]
 [2 3]
 [4 5]]
创建 a 的视图:
[[0 1]
 [2 3]
 [4 5]]
两个数组的 id() 不同:
a 的 id():
4314786992
b 的 id():
4315171296
b 的形状:
[[0 1 2]
 [3 4 5]]
a 的形状:
[[0 1]
 [2 3]
 [4 5]]

Die Verwendung von Slices zum Erstellen von Ansichten und das Ändern von Daten wirken sich auf das ursprüngliche Array aus:

Beispiel

import numpy as np arr = np.arange(12) print ('Unser Array:') print (arr) print ('Einen Slice erstellen:') a=arr[3:] b=arr[3:] a[1]=123 b[2]=234 print(arr) print(id(a),id(b),id(arr[3:]))

Das Ausgabeergebnis ist:

我们的数组:
[ 0  1  2  3  4  5  6  7  8  9 10 11]
创建切片:
[  0   1   2   3 123 234   6   7   8   9  10  11]
4545878416 4545878496 4545878576

Die Variablen a und b sind beide Ansichten von Teilen von arr. Änderungen an den Ansichten spiegeln sich direkt in den Originaldaten wider. Wenn wir jedoch die IDs von a und b betrachten, sind sie unterschiedlich. Das heißt, obwohl Ansichten auf die Originaldaten verweisen, unterscheiden sie sich dennoch von Zuweisungsreferenzen.

Kopie oder tiefe Kopie

Die Funktion ndarray.copy() erstellt eine Kopie. Das Ändern der Daten der Kopie wirkt sich nicht auf die Originaldaten aus; sie befinden sich nicht an derselben physischen Speicherstelle.

Beispiel

import numpy as np a = np.array([[10,10], [2,3], [4,5]]) print ('Array a:') print (a) print ('Erstellen Sie eine tiefe Kopie von a:') b = a.copy() print ('Array b:') print (b) # b teilt nichts mit a print ('Können wir in b schreiben, um a zu ändern?') print (b is a) print ('Ändern Sie den Inhalt von b:') b[0,0] = 100 print ('Das geänderte Array b:') print (b) print ('a bleibt unverändert:') print (a)

Das Ausgabeergebnis ist:

数组 a:
[[10 10]
 [ 2  3]
 [ 4  5]]
创建 a 的深层副本:
数组 b:
[[10 10]
 [ 2  3]
 [ 4  5]]
我们能够写入 b 来写入 a 吗?
False
修改 b 的内容:
修改后的数组 b:
[[100  10]
 [  2   3]
 [  4   5]]
a 保持不变:
[[10 10]
 [ 2  3]
 [ 4  5]]

Weitere verwandte Artikel

Analyse von direkter Zuweisung, flacher Kopie und tiefer Kopie in Python

Andere Erweiterungen