视图
(
浅拷贝
)
一般发生在:
1
、
numpy
的切片操作返回原数据的视图。
2
、调用
ndarray
的
view()
函数产生一个视图。
对视图进行修改,它会影响到原始数据
副本
(
深拷贝
)
一般发生在:
Python
序列的切片操作,调用
deepCopy()
函数。
调用
ndarray
的
copy()
函数产生一个副本。
对副本进行修改,它不会影响到原始数据
1
、无复制
简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同
id()
来访问它。
id()
返回
Python
对象的通用标识符,类似于 C
中的指针。
一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的
形状。
import numpy as np
arr=np.array([1,2,3])
print(arr)#[1 2 3]
print(id(arr))#2296801808944
2
、视图或浅拷贝
ndarray.view() 实现数组的浅拷贝,切片也是一种浅拷贝
import numpy as np
arr1=np.array([[1,2,3],[4,5,6]])
arr2=arr1.view()
print(arr1)
# [[1 2 3]
# [4 5 6]]
print("---------")
print(arr2)
# [[1 2 3]
# [4 5 6]]
print(id(arr1),id(arr2))#2847997319408 2847997317680
3
、副本或深拷贝
ndarray.copy()
函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
import numpy as np
a = np.array([[1,1], [2,2]])
print(a)
# [[1 1]
# [2 2]]
b = a.copy()
print(b)# b 与 a 不共享任何内容
# [[1 1]
# [2 2]]
print(id(a),id(b))
# 3014993728048 3014990560304
b[1,0] = 100
print(b)
# [[ 1 1]
# [100 2]]
print(a)
# [[1 1]
# [2 2]]