Numpy 深拷贝、浅拷贝、视图的知识总结

这篇博客介绍了Numpy中深拷贝、浅拷贝和视图的概念。浅拷贝通过ndarray.view()创建新对象,共享相同内存,改变其中一个会影响另一个。深拷贝通过np.copy()创建独立副本,修改不影响原对象。视图是数据的别称,修改会影响原始数据。
摘要由CSDN通过智能技术生成

关于“深拷贝和浅拷贝”的官方定义:

The difference between shallow and deep copying is only relevant for compound objects (objects that contain other objects, like lists or
class instances).
A shallow copy constructs a new compound object and then (to the
extent possible) inserts the same objects into it that the
original contains.
A deep copy constructs a new compound object and then, recursively,inserts copies into it of the objects found in the original.
翻译:
浅和深拷贝的区别仅仅是相关的复合对象(包含其他对象的对象,比如列表或类实例)。
浅拷贝构造一个对象,然后(新的化合物尽可能)将相同的对象插入它最初的包含。
深拷贝构造一个新的复合对象,然后递归地,将副本插入它在最初发现的对象。

1、浅拷贝

浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。
浅拷贝会创建新对象,其内容非原对象本身的引用,而是原对象内第一层对象的引用。(拷贝组合对象,不拷贝子对象)
常见的浅拷贝有:切片操作、工厂函数、对象的copy()方法、copy模块中的copy函数。

浅拷贝

共享地址的两个变量,当其中一个变量的值改变时,另一个变量的值也随之改变。此时,变量间的“拷贝”是“浅拷贝”。
浅拷贝举例
浅拷贝举例

浅拷贝——ndarray.view()

共享“视图”(view)的两个变量,当其中一个变量的值改变时,另一个变量的值也随之改变。此时,变量间的“拷贝”也是“浅拷贝”。
np.array举例

2、深拷贝

深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以递归的方式,通过创建新的子对象拷贝到新对象中。因此,它的时间和空间开销要高,新对象和原对象没有任何关联。
若上图所示,深拷贝后,新的复合对象包含的对象,若对象为不可变对象,则 id 值保持不变,若对象为可变对象,则 id 值发生改变

深拷贝——np.copy()

通过“深拷贝”得到的变量互不干扰,其中一个变量的值改变时,不影响其他变量的值。
深拷贝举例

3、存取元素中的“浅拷贝”与“深拷贝”

当使用整数序列对数组元素进行存取时,将整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间
整数序列举例
当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组,不能使用布尔列表。
在这里插入图片描述

4、视图

视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。

视图一般发生在:
1、numpy 的切片操作返回原数据的视图。
2、调用 ndarray 的 view() 函数产生一个视图。

ndarray.view()

ndarray.view()会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数。
在这里插入图片描述
使用切片创建视图修改数据会影响到原始数组
在这里插入图片描述

ndarray.copy()

ndarray.copy()函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
在这里插入图片描述

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值