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副本和视图(视图或浅拷贝、副本或深拷贝、深浅拷贝)相关推荐

  1. 自定义视图 视图控制器(UIViewController)

    CustomViewAndUIViewController loadView方法内部对self.view进行创建 RootViewController继承于UIViewContrller的子类 自定义 ...

  2. 用户视图切换为Linux视图,视图_ITPUB博客

    视图 视图是由已存在的数据,通过一定的运算规则,来获得新的数据集合.可以让用于更加灵活的自定义数据集合,以及为数据安全性提供了一种控制策略. 一. 关系视图 1. 创建关系视图 create or r ...

  3. 魔兽怀旧服务器维护副本是否重置,魔兽世界怀旧服副本重置时间

    在魔兽世界怀旧服中,副本的重置是有时间限制的,很多玩家对于游戏中的副本重置机制并不是非常的清楚,那么今天就由小编来告诉大家魔兽世界怀旧服中副本的重置规则. 正确答案 1.游戏中的4人的普通副本是可以让 ...

  4. Kafka系列 - 10 Kafka副本|分区副本分配|手动调整分区副本|Leader Partition 负载平衡|增加副本因子

    文章目录 1. 分区副本分配 2. 手动调整分区副本 3. Leader Partition 负载平衡 4. 增加副本因子 1. 分区副本分配 如果 kafka 服务器只有 4 个节点,那么设置 ka ...

  5. 【kafka运维】分区副本重分配、数据迁移、副本扩缩容 (附教学视频)

    日常运维.问题排查=> 滴滴开源LogiKM一站式Kafka监控与管控平台 (后续的视频会在 公众号[首发].CSDN.B站等各平台同名号[石臻臻的杂货铺]上上传 ) 分区副本重分配+注意事项+ ...

  6. python可变类型和不可变深浅拷贝类型_理解python可变类型vs不可变类型,深拷贝vs浅拷贝...

    核心提示: 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutable):数字,字符串,元组 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 ...

  7. SQL Server创建视图——视图的作用

    视图简介: 视图可以看作定义在SQL Server上的虚拟表.视图正如其名字的含义一样,是另一种查看数据的入口. 常规视图本身并不存储实际的数据,而仅仅是由SELECT语句组成的查询定义的虚拟表 . ...

  8. django 视图-----视图函数

    定义视图 本质就是一个函数 视图的参数 一个HttpRequest实例 通过正则表达式组获取的位置参数 通过正则表达式组获得的关键字参数 在应用目录下默认有views.py文件,一般视图都定义在这个文 ...

  9. UI 自定义视图 ,视图管理器

    一>自定义label - textField 视图 自定义视图:系统标准UI之外,自己组合而出的新的视图 iOS 提供了很多UI组件 ,借助它们,我们可以做各种程序 尽管如此,实际开发中,我们还 ...

最新文章

  1. elasticsearch 分片_Elasticsearch最佳实践之分片使用优化
  2. C++基础——类继承
  3. Problem 59 GCC密切相关的一些环境变量?
  4. 求p1+5和p2+5等于多少?
  5. 编写五子棋程序时如何添加下棋时的音效_干货:如何提高编程能力
  6. js 用迭代器模式优雅的处理递归问题
  7. mysql 表丢失_Mysql数据库备份 部分数据表丢失 Mysql table doesn't exist 解决
  8. SQL Server中的STUFF函数的使用
  9. NOTEPAD大神是否鄙视一切IDE?
  10. Mysql学习笔记(一)数据类型
  11. sql数据库 订阅发布_如何使用中央发布者和多个订阅者数据库设置自定义SQL Server事务复制
  12. pythonista安装tkinter_Python又把GUI界面攻下了,今天就告诉你怎么玩
  13. 【原创】Mac 工作协同之文件共享问题
  14. 2021-09-13强化学 习 原理及技术介绍
  15. 军职在线大学生计算机基础答案,大学计算机基础试题-及答案~完整版.doc
  16. 花生壳+FileZilla搭建公网FTP服务器
  17. 利用神经网络识别12306验证码——(四)数据增广以及训练集、验证集的划分
  18. 博弈论题目集 (持续更新)
  19. 电影票房排行 API数据接口
  20. 武汉大学信管专业期末复习系列——《计算机网络》(谢希仁版)(网络层)

热门文章

  1. 表弟:这数学规律题该怎么解决呢?使用Python你会发现很简单
  2. python3+opencv+tkinter开发简单的人脸识别小程序
  3. OpenCASCADE:Foundation Classes之插件管理
  4. wxWidgets:wxTimePickerCtrl类用法
  5. wxWidgets:wxHashMap类用法
  6. wxWidgets:wxClipboardTextEvent类用法
  7. boost::ratio_abs相关的测试程序
  8. boost::fusion::traits::is_sequence用法的测试
  9. boost::describe模块实现打印功能的测试程序
  10. GDCM:gdcm::Decoder的测试程序