副本和视图
优质
小牛编辑
141浏览
2023-12-01
简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同来访问它。 id()
返回 Python 对象的通用标识符,类似于 C 中的指针。
此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。
我们的数组是:
[0 1 2 3 4 5]
调用 id() 函数:
139747815479536
a 赋值给 b:
[0 1 2 3 4 5]
b 拥有相同 id():
139747815479536
修改 b 的形状:
[[0 1]
[2 3]
[4 5]]
a 的形状也修改了:
[[0 1]
[2 3]
[4 5]]
NumPy 拥有ndarray.view()
方法,它是一个新的数组对象,并可查看原始数组的相同数据。 与前一种情况不同,新数组的维数更改不会更改原始数据的维数。
输出如下:
[[0 1]
[2 3]
创建 a 的视图:
[[0 1]
[2 3]
[4 5]]
两个数组的 id() 不同:
a 的 id():
140424307227264
b 的 id():
140424151696288
b 的形状:
[[0 1 2]
[3 4 5]]
a 的形状:
[[0 1]
[2 3]
[4 5]]
输出如下:
我们的数组:
[[10 10]
[ 2 3]
[ 4 5]]
[[10 10]
[ 2 3]
[ 4 5]]
ndarray.copy()
函数创建一个深层副本。 它是数组及其数据的完整副本,不与原始数组共享。
数组 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]
[ 4 5]]