张伟
Python的Numpy的Array的副本(copy)和视图(view)
2020-9-19 21:59
阅读:3107

      操作和修改数组时,他们的数据有时被复制到一个新的数组中有时候没有,这很容易让人误解。

      副本(深拷贝)是一个数据的完整的拷贝,如果我们对其进行修改,它不会影响到原始数据,物理内存(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

转载本文请联系原作者获取授权,同时请注明本文来自张伟科学网博客。

链接地址:https://wap.sciencenet.cn/blog-3428464-1251288.html?mobile=1

收藏

分享到:

当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?