English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NumPy 数组副本和视图

Eine Kopie ist eine vollständige Kopie der Daten, wenn wir die Kopie ändern, beeinflusst es die ursprünglichen Daten nicht, und der physische Speicher ist nicht an derselben Position.
Eine Ansicht ist ein Alias oder ein Verweis auf Daten, durch das Alias oder den Verweis kann auf das ursprüngliche Daten zugegriffen und darauf operiert werden, aber es wird keine Kopie der ursprünglichen Daten erstellt. Wenn wir die Ansicht ändern, beeinflusst es die ursprünglichen Daten, und der physische Speicher ist an derselben Position.

Unterschied zwischen Kopie und Ansicht

Der Hauptunterschied zwischen Kopien und Array-Ansichten besteht darin, dass eine Kopie ein neuer Array ist, während die Ansicht nur eine Ansicht des ursprünglichen Arrays ist.Kopien besitzen Daten, jede Änderung an der Kopie beeinflusst den ursprünglichen Array nicht, und jede Änderung am ursprünglichen Array beeinflusst die Kopie nicht.Ansichten besitzen keine Daten, jede Änderung an der Ansicht beeinflusst den ursprünglichen Array, und jede Änderung am ursprünglichen Array beeinflusst die Ansicht.

Ansichten treten in der Regel auf:

1、Schneiden Sie die numpy und geben Sie die Ansicht des ursprünglichen Daten zurück.2、Erstellen Sie eine Ansicht durch Aufruf der Funktion view() von ndarray.

Kopien treten in der Regel auf:

Schneiden Sie die Python-Serie und rufen Sie die Funktion deepCopy() auf.Erstellen Sie eine Kopie durch Aufruf der Funktion copy() von ndarray.

无复制

keine Kopie

>>> einfache Zuweisung erstellt keine Kopie des Array-Objekts. Stattdessen verwendet sie denselben id() des ursprünglichen Arrays, um darauf zuzugreifen. id() gibt den universellen Identifikator eines Python-Objekts zurück, ähnlich einem Zeiger in C. Darüber hinaus wird jede Änderung eines Arrays auf das andere übertragen. Zum Beispiel ändert sich die Form eines Arrays auch, wenn die Form des anderen Arrays geändert wird.
>>> import numpy as np6)
>>> a = np.arange(
>>> print ('Unsere Array ist:',a) 1 2 3 4 5]
Unsere Array ist: [0
>>> print ('Aufruf der id() Funktion:',id(a)) 4553321728
Aufruf der id() Funktion:
>>> b.shape =
>>> b = a 1 2 3 4 5]
[0
>>> print ('b hat das gleiche id():',id(b)) 4553321728
>>> b hat das gleiche id(): 3,2
>>> b.shape =
[[0 1]
 [2 3]
 [4 5]]
>>> print (b)
[[0 1]
 [2 3]
 [4 5]]
>>> print (a)

>>>

ndarray.view() erstellt einen neuen Array-Objekt, und die Änderung der Dimensionen des neuen Arrays ändert nicht die Dimensionen der ursprünglichen Daten. Ansicht oder flaches Kopieren

import numpy as np 
 
 # Am Anfang ist a ein 3X2 des Arrays
a = np.arange(6).reshape(3,2) 
print ('数组 a:')
print (a)
print ('Erstellung einer Ansicht von a:')
b = a.view() 
print (b)
print ('Die id() der beiden Arrays sind unterschiedlich:')
print ('id() von a:')
print (id(a))
print ('id() von b:')
print (id(b))
 # Ändern der Form von b, ohne a zu ändern
b.shape = 2,3
print ('Form von b:')
print (b)
print ('Form von a:')
print (a)

输出结果为:

数组 a:
[[0 1]
 [2 3]
 [4 5]]
Erstellung einer Ansicht von a:
[[0 1]
 [2 3]
 [4 5]]
Die id() der beiden Arrays sind unterschiedlich:
id() von a:
4314786992
id() von b:
4315171296
Form von b:
[[0 1 2]
 [3 4 5]]
Form von a:
[[0 1]
 [2 3]
 [4 5]]

Die Verwendung von Streifen zur Erstellung von Ansichten und das Ändern von Daten beeinflusst das ursprüngliche Array:

import numpy as np 
arr = np.arange(12)
print ('Unser Array:')
print (arr)
print ('Erstellung von Streifen:')
a=arr[2:]
b=arr[2:]
a[1])=123456
b[2])=23445
print(arr)
print(id(a),id(b),id(arr[3:]))

输出结果为:

Unser Array:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
Erstellung von Streifen:
[ 0 1 2 123456 23445 5 6 7 8 9
     10 11]
4669930672 4444330304 4670012352
Verarbeitung beendet mit Beendigungscode 0

变量 a,b 都是 arr 的一部分视图,对视图的修改会直接反映到原数据中。但是我们观察 a,b 的 id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。

副本或深拷贝

ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。

import numpy as np 
 
a = np.array([10,10], [2,3], [4,5]] 
print ('数组 a:')
print (a)
print ('创建 a 的深层副本:')
b = a.copy() 
print ('数组 b:')
print (b)
 # b 与 a 不共享任何内容 
print ('我们能够写入 b 来写入 a 吗?')
print (b is a)
print ('修改 b 的内容:')
b[0,0] = 100 
print ('修改后的数组 b:')
print (b)
print ('a 保持不变:')
print (a)

输出结果为:

数组 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]]