B18_NumPy副本和视图(视图或浅拷贝、副本或深拷贝、深浅拷贝)
NumPy副本和视图
副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。
视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。
视图一般发生在:
1、numpy的切片操作返回原数据的视图。
2、调用ndarray的view()函数产生一个视图。
副本一般发生在:Python序列的切片操作,调用deepCopy()函数。
调用ndarray的copy()函数产生一个副本。
无复制
简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。
此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。
实例
import numpy as npa = np.arange(6)
print ('我们的数组是:')
print (a)
print ('调用 id() 函数:')
print (id(a))
print ('a 赋值给 b:')
b = a
print (b)
print ('b 拥有相同 id():')
print (id(b))
print ('修改 b 的形状:')
b.shape = 3,2
print (b)
print ('a 的形状也修改了:')
print (a)
输出结果为:
我们的数组是:
[0 1 2 3 4 5]
调用 id() 函数:
2160389265488
a 赋值给 b:
[0 1 2 3 4 5]
b 拥有相同 id():
2160389265488
修改 b 的形状:
[[0 1][2 3][4 5]]
视图或浅拷贝
ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数。
实例
import numpy as np# 最开始 a 是个 3X2 的数组
a = np.arange(6).reshape(3, 2)
print('数组 a:')
print(a)
print('创建 a 的视图:')
b = a.view()
print(b)
print('两个数组的 id() 不同:')
print('a 的 id():')
print(id(a))
print('b 的 id():')
print(id(b))
# 修改 b 的形状,并不会修改 a
b.shape = 2, 3
print('b 的形状:')
print(b)
print('a 的形状:')
print(a)
输出结果为:
数组 a:
[[0 1][2 3][4 5]]
创建 a 的视图:
[[0 1][2 3][4 5]]
两个数组的 id() 不同:
a 的 id():
2336918390944
b 的 id():
2336918391184
b 的形状:
[[0 1 2][3 4 5]]
a 的形状:
[[0 1][2 3][4 5]]
使用切片创建视图修改数据会影响到原始数组:
import numpy as nparr = np.arange(12)
print('我们的数组:')
print(arr)
print('创建切片:')
a = arr[3:]
b = arr[3:]
a[1] = 123
b[2] = 234
print(arr)
print(id(a), id(b), id(arr[3:]))
输出结果为:
我们的数组:
[ 0 1 2 3 4 5 6 7 8 9 10 11]
创建切片:
[ 0 1 2 3 123 234 6 7 8 9 10 11]
2897481484528 2897481484448 2897481484688
变量 a,b 都是 arr 的一部分视图,对视图的修改会直接反映到原数据中。但是我们观察 a,b 的 id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。
副本或深拷贝
ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
import numpy as npa = np.array([[10, 10], [2, 3], [4, 5]])
print('数组 a:')
print(a)
print('创建 a 的深层副本:')
b = a.copy()
print('数组 b:')
print(b)
# b 与 a 不共享任何内容
print('我们能够写入 b 来写入 a 吗?')
print(b is a)
print('修改 b 的内容:')
b[0, 0] = 100
print('修改后的数组 b:')
print(b)
print('a 保持不变:')
print(a)
输出结果为:
数组 a:
[[10 10][ 2 3][ 4 5]]
创建 a 的深层副本:
数组 b:
[[10 10][ 2 3][ 4 5]]
我们能够写入 b 来写入 a 吗?
False
修改 b 的内容:
修改后的数组 b:
[[100 10][ 2 3][ 4 5]]
a 保持不变:
[[10 10][ 2 3][ 4 5]]
深浅拷贝
在 Python 中,对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,Python 并没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝。
在 Python 中,为了使当进行赋值操作时,两个变量互补影响,可以使用 copy 模块中的 deepcopy 方法,称之为深拷贝。
append()函数
当 list 类型的对象进行 append 操作时,实际上追加的是该对象的引用。
id() 函数:返回对象的唯一标识,可以类比成该对象在内存中的地址。
>>>alist = []
>>> num = [2]
>>> alist.append( num )
>>> id( num ) == id( alist[0] )
True
如上例所示,当 num 发生变化时(前提是 id(num) 不发生变化),alist 的内容随之会发生变化。往往会带来意想不到的后果,想避免这种情况,可以采用深拷贝解决:
alist.append( copy.deepcopy( num ) )
B18_NumPy副本和视图(视图或浅拷贝、副本或深拷贝、深浅拷贝)相关推荐
- 自定义视图 视图控制器(UIViewController)
CustomViewAndUIViewController loadView方法内部对self.view进行创建 RootViewController继承于UIViewContrller的子类 自定义 ...
- 用户视图切换为Linux视图,视图_ITPUB博客
视图 视图是由已存在的数据,通过一定的运算规则,来获得新的数据集合.可以让用于更加灵活的自定义数据集合,以及为数据安全性提供了一种控制策略. 一. 关系视图 1. 创建关系视图 create or r ...
- 魔兽怀旧服务器维护副本是否重置,魔兽世界怀旧服副本重置时间
在魔兽世界怀旧服中,副本的重置是有时间限制的,很多玩家对于游戏中的副本重置机制并不是非常的清楚,那么今天就由小编来告诉大家魔兽世界怀旧服中副本的重置规则. 正确答案 1.游戏中的4人的普通副本是可以让 ...
- Kafka系列 - 10 Kafka副本|分区副本分配|手动调整分区副本|Leader Partition 负载平衡|增加副本因子
文章目录 1. 分区副本分配 2. 手动调整分区副本 3. Leader Partition 负载平衡 4. 增加副本因子 1. 分区副本分配 如果 kafka 服务器只有 4 个节点,那么设置 ka ...
- 【kafka运维】分区副本重分配、数据迁移、副本扩缩容 (附教学视频)
日常运维.问题排查=> 滴滴开源LogiKM一站式Kafka监控与管控平台 (后续的视频会在 公众号[首发].CSDN.B站等各平台同名号[石臻臻的杂货铺]上上传 ) 分区副本重分配+注意事项+ ...
- python可变类型和不可变深浅拷贝类型_理解python可变类型vs不可变类型,深拷贝vs浅拷贝...
核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutable):数字,字符串,元组 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 ...
- SQL Server创建视图——视图的作用
视图简介: 视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口. 常规视图本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询定义的虚拟表 . ...
- django 视图-----视图函数
定义视图 本质就是一个函数 视图的参数 一个HttpRequest实例 通过正则表达式组获取的位置参数 通过正则表达式组获得的关键字参数 在应用目录下默认有views.py文件,一般视图都定义在这个文 ...
- UI 自定义视图 ,视图管理器
一>自定义label - textField 视图 自定义视图:系统标准UI之外,自己组合而出的新的视图 iOS 提供了很多UI组件 ,借助它们,我们可以做各种程序 尽管如此,实际开发中,我们还 ...
最新文章
- elasticsearch 分片_Elasticsearch最佳实践之分片使用优化
- C++基础——类继承
- Problem 59 GCC密切相关的一些环境变量?
- 求p1+5和p2+5等于多少?
- 编写五子棋程序时如何添加下棋时的音效_干货:如何提高编程能力
- js 用迭代器模式优雅的处理递归问题
- mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决
- SQL Server中的STUFF函数的使用
- NOTEPAD大神是否鄙视一切IDE?
- Mysql学习笔记(一)数据类型
- sql数据库 订阅发布_如何使用中央发布者和多个订阅者数据库设置自定义SQL Server事务复制
- pythonista安装tkinter_Python又把GUI界面攻下了,今天就告诉你怎么玩
- 【原创】Mac 工作协同之文件共享问题
- 2021-09-13强化学 习 原理及技术介绍
- 军职在线大学生计算机基础答案,大学计算机基础试题-及答案~完整版.doc
- 花生壳+FileZilla搭建公网FTP服务器
- 利用神经网络识别12306验证码——(四)数据增广以及训练集、验证集的划分
- 博弈论题目集 (持续更新)
- 电影票房排行 API数据接口
- 武汉大学信管专业期末复习系列——《计算机网络》(谢希仁版)(网络层)
热门文章
- 表弟:这数学规律题该怎么解决呢?使用Python你会发现很简单
- python3+opencv+tkinter开发简单的人脸识别小程序
- OpenCASCADE:Foundation Classes之插件管理
- wxWidgets:wxTimePickerCtrl类用法
- wxWidgets:wxHashMap类用法
- wxWidgets:wxClipboardTextEvent类用法
- boost::ratio_abs相关的测试程序
- boost::fusion::traits::is_sequence用法的测试
- boost::describe模块实现打印功能的测试程序
- GDCM:gdcm::Decoder的测试程序