NumPy - 副本和视图

在执行函数时,其中一些返回输入数组的副本,而另一些返回视图。 当内容物理存储在另一个位置时,称为副本。 另一方面,如果提供了相同内存内容的不同视图,我们将其称为视图

无复制

简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。 此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。

视图或浅复制

NumPy 拥有ndarray.view()方法,它是一个新的数组对象,并可查看原始数组的相同数据。 与前一种情况不同,新数组的维数更改不会更改原始数据的维数 切片属于视图

深复制

ndarray.copy()函数创建一个深层副本。 它是数组及其数据的完整副本,不与原始数组共享。

import numpy as np

a = np.arange(6)
b = a
b.shape = 3, 2
print(a)
print(id(a) == id(b)) # 直接使用 = 复制 a和b 完全一致
c = a.view()
print(id(a) == id©) # 浅复制 它是一个新的数组对象,并可查看原始数组的相同数据。 与前一种情况不同,新数组的维数更改不会更改原始数据的维数。
c[[0, 0]] = 20
print(a) # 浅复制 共享同一套数据 创建视图
d = a.copy()
print(id(a) == id(d))
d[[1, 1]] = 30
print(a) # ndarray.copy()函数创建一个深层副本。 它是数组及其数据的完整副本,不与原始数组共享
s = a[:, :2] # !!! 切片属于浅复制 创建视图
s[[1, 1]] = 40
print(a)