numpy的无拷贝,视图(浅拷贝)和深拷贝( numpy.copy)

无拷贝

赋值操作不会发生拷贝,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]

感谢:
https://blog.csdn.net/genghaihua/article/details/92806584?ops_request_misc=&request_id=&biz_id=102&utm_term=numpy.copy&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-92806584


原文出处:/show_1EF5aw2o1Q8Y.html