||
操作和修改数组时,他们的数据有时被复制到一个新的数组中有时候没有,这很容易让人误解。
副本(深拷贝)是一个数据的完整的拷贝,如果我们对其进行修改,它不会影响到原始数据,物理内存(id( ))不在同一位置。实现方式:
(1)Python 序列的切片操作;
(2)Python调用copy.deepCopy()函数(详见上一篇博客);
(3)调用 ndarray的 copy() 函数产生一个副本(注意:ndarray没有deepcopy()属性,同时这里的copy()是ndarray的自带属性,不需要引入copy模块;)
视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,虽然视图和原始数据的id不同,但是如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
实现方式:
(1)numpy 的切片操作返回原数据的视图;
(2)调用 ndarray 的 view() 函数产生一个视图;
下面举三个例子:
1.No copy at all (一点也没有复制)
import numpy as np
a = np.arange(12)
b = a #并没有新的对象被创建,a和b只是相同ndarray对象的两个名字而已,下面用id()来验证一下
print(id(a),id(b))
可见a和b指向同一个数据对象。
2.View or Shallow Copy
c = a.view() #method of numpy.ndarry instance numpy.ndarry实例的方法
以下可见c = a.view()创建了一个新的对象,但是这两个对象共享相同的数据。
如上所见,对象c和a都可以对数据的数值进行修改,但是c不能对shape属性进行修改。
另外切片数据也会返回“视图”对象。
s[:]是s的一个视图
3.Deep Copy(深度复制)
d = a.copy() #a new array object with new data is created
点滴分享,福泽你我!Add oil!
【参考】
https://blog.csdn.net/qq_37553899/article/details/78793226
https://blog.csdn.net/u014157109/article/details/89764385
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-3 04:28
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社