python - 视图和 numpy 数组的浅拷贝有什么区别?
问题描述
在 NumPy 中,我知道对数组进行切片会给你一个“视图”,在我看来这与浅拷贝完全相同。它们有何不同?
解决方案
与包含对第一级元素对象的引用的 Python 列表对象(反过来可能引用更深层次的对象)不同,NumPy 数组仅引用单个数据缓冲区,该缓冲区存储数组所有维度的所有元素值,并且在此数据缓冲区之外没有元素对象的层次结构。
列表的浅表副本将包含第一级元素引用的副本,并与原始列表共享引用的元素对象。NumPy 数组的浅拷贝应该包含什么不太明显。它应该 ( A ) 与原始数据缓冲区共享数据缓冲区,还是 ( B ) 拥有自己的副本(这实际上使其成为深层副本)?
NumPy 数组的视图是A意义上的浅拷贝,即它引用与原始数据相同的数据缓冲区,因此对原始数据的更改会影响视图数据,反之亦然。
库函数copy.copy()应该创建其参数的浅表副本,但是当应用于 NumPy 数组时,它会创建意义上 B 的浅表副本,即新数组获取自己的数据缓冲区副本,因此更改到一个阵列不影响另一个。
下面是一些代码,显示了复制/查看 NumPy 数组的不同方法:
import numpy as np
import copy
x = np.array([10, 11, 12, 13])
# Create views of x (shallow copies sharing data) in 2 different ways
x_view1 = x.view()
x_view2 = x[:] # Creates a view using a slice
# Create full copies of x (not sharing data) in 2 different ways
x_copy1 = x.copy()
x_copy2 = copy.copy(x) # Calls x.__copy__() which creates a full copy of x
# Change some array elements to see what happens
x[0] = 555 # Affects x, x_view1, and x_view2
x_view1[1] = 666 # Affects x, x_view1, and x_view2
x_view2[2] = 777 # Affects x, x_view1, and x_view2
x_copy1[0] = 888 # Affects only x_copy1
x_copy2[0] = 999 # Affects only x_copy2
print(x) # [555 666 777 13]
print(x_view1) # [555 666 777 13]
print(x_view2) # [555 666 777 13]
print(x_copy1) # [888 11 12 13]
print(x_copy2) # [999 11 12 13]
上面的示例创建了整个原始数组索引范围的视图,并具有与原始相同的数组属性,这不是很有趣(可以用简单的别名替换,例如 x_alias = x)。视图的强大之处在于它们可以是原始选定部分的视图,并且具有不同的属性。这在接下来的几行代码中得到了证明,这些代码扩展了上面的例子:
x_view3 = x[::2].reshape(2,1) # Creates a reshaped view of every 2nd element of x
print(x_view3) # [[555]
# [777]]
x_view3[1] = 333 # Affects 2nd element of x_view3 and 3rd element of x
print(x) # [555 666 333 13]
print(x_view3) # [[555]
# [333]]
推荐阅读
- r - 在 RStudio 中绘制图形
- node.js - CORS 无法识别我的前端的 IP 地址
- python - 如何使用 PyTorch 对数组中的数字执行无监督聚类
- react-native - 在反应原生应用程序中多次调用 AsyncStorage 会影响性能吗?
- algorithm - 做有效加权排名的算法?
- flutter - Flutter 如何在类中使用 setState 或其他东西
- reactjs - 如何在 react-native 中呈现 Html 并更改数据?
- javascript - 通过迭代数组链接承诺
- azure-devops - 如何在 azure devops 上使用触发管道信息标记触发管道
- java - 在两个 if 语句中使用 Java 中的变量