NumPy 数组副本与视图

副本和视图之间的区别

数组的副本和视图之间的主要区别在于,副本是一个新数组,而视图只是原始数组的视图。

副本拥有数据,对副本所做的任何更改都不会影响原始数组,对原始数组所做的任何更改也不会影响副本。

视图不拥有数据,对视图所做的任何更改都会影响原始数组,对原始数组所做的任何更改都会影响视图。

副本

实例

制作副本,更改原始数组,然后显示两个数组:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
x = arr.copy()
arr[0] = 42

print(arr)
print(x)

亲自试一试

提示:副本不应受到对原始数组所做的更改的影响。

视图

实例

创建视图,更改原始数组并显示两个数组:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
arr[0] = 42

print(arr)
print(x)

亲自试一试

视图应该受到对原始数组所做的更改的影响。

在视图中进行更改:

实例

创建视图、更改视图并显示两个数组:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
x = arr.view()
x[0] = 31

print(arr)
print(x)

亲自试一试

提示:原始数组应该受到对视图所做的更改的影响。

检查数组是否拥有其数据

如上所述,副本拥有数据,而视图不拥有数据,但是我们如何检查这一点呢?

每个 NumPy 数组都有一个属性 base,如果数组拥有数据,则返回 None

否则,base 属性将引用原始对象。

实例

打印 base 属性的值以检查数组是否拥有其数据:

import numpy as np

arr = np.array([1, 2, 3, 4, 5])

x = arr.copy()
y = arr.view()

print(x.base)
print(y.base)

亲自试一试

提示:副本返回 None。视图返回原始数组。