NJU1healer的个人博客分享 http://blog.sciencenet.cn/u/NJU1healer

博文

Python的Numpy的Array的副本(copy)和视图(view)

已有 3054 次阅读 2020-9-19 21:59 |个人分类:Python|系统分类:科研笔记

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

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

上一篇:邻接矩阵与邻接表
下一篇:np.random.seed()的作用
收藏 IP: 211.162.81.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-12-3 04:28

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部