无拷贝
赋值操作不会发生拷贝,2个引用指向同一个内存地址
import numpy as np
arr=np.array([0,1,3])
arr2=arr
print(id(arr))
print(id(arr2))
执行结果:
4495591744
4495591744
说明内存地址一样,没有发生拷贝
视图(浅拷贝)
调用view(),或 numpy的slice(切片)操作,会copy父对象,不会copy底层的数据。
如果在view上修改数据,会直接反馈到原对象,修改view的形状,则不会影响原对象
import numpy as np
arr=np.array([0,1,3])
# 切片
arr3=arr[:]
# 下面代码效果相同
# arr3=arr.view()
print(id(arr))
print(id(arr3))
执行结果:
4495591744
4495806256
可知,内存地址不一样
修改arr3的值,也会影响arr的值
arr3[0]=100
print(arr)
print(arr3)
执行结果:
[100 1 3]
[100 1 3]
修改arr3的形状,则不会影响arr
arr3.shape = 1,3
print(arr)
print(arr3)
执行结果:
[100 1 3]
[[100 1 3]]
深拷贝
对原数组对象及其子数组对象都进行copy一份,对新生成的数组对象进行 修改删除 操作不会影响到原对象。
import numpy as np
arr=np.array([0,1,3])
# 深拷贝
arr4=arr.copy()
print(id(arr))
print(id(arr4))
执行结果:
4618212256
4618212496
修改arr4的值,不会影响原数组
arr4[0]=100
print(arr)
print(arr4)
执行结果:
[0 1 3]
[100 1 3]