美文网首页Python数据分析
Numpy的视图与副本

Numpy的视图与副本

作者: 躺在稻田里的小白菜 | 来源:发表于2018-08-01 10:33 被阅读62次

一. 什么是视图和副本

  • 视图:可理解为原有数据的一个别称或引用(但是这个引用和赋值产生的引用不同),通过该别称或引用便可访问、操作原有数据,但原有数据不会产生拷贝,所以对于视图的修改会反映到原数据中,类似于Java的浅拷贝。
  • 副本:数据的一个完整的拷贝,修改副本不会影响原数据,类似于Java中的深拷贝。

二. 何时出现视图,何时出现副本

视图一般发生在:

  • numpy的切片操作返回原数据的视图
  • 调用ndarray的view()函数产生一个视图

副本一般发生在:

  • Python序列的切片操作
  • 调用ndarray的copy()函数产生一个副本

三. 具体看几个栗子

1. 完全不发生拷贝

这种情况一般发生在赋值操作中。看下面这个栗子,两个变量a,b都指向同一块内存区域,id相同,完全没有发生拷贝。

a=[1,2,3,4]
b=a
print(id(a),id(b))

Out:
196674184 196674184
2. 发生视图的情况

Numpy的切片操作会返回原数据的视图,变量a,b都是arr的一部分视图,对视图的修改会直接反映到原数据中。但是我们观察a,b的id,他们是不同的,也就是说,视图虽然指向原数据,但是他们和赋值引用还是有区别的。

arr=np.arange(12)
print(arr)
a=arr[3:]
b=arr[3:]
a[1]=123
b[2]=234
print(arr)
print(id(a),id(b),id(arr[3:]))

Out:
[ 0  1  2  3  4  5  6  7  8  9 10 11]
[  0   1   2   3 123 234   6   7   8   9  10  11]
196727792 196728512 196728192
3. 发生副本的情况

Python序列的切片会 返回一个副本,修改副本对原数据不影响。

arr=[1,2,3,4,5]
a=arr[1:]
a[3]=111
print(arr,a)

Out:
[1, 2, 3, 4, 5] [2, 3, 4, 111]

相关文章

  • Numpy的视图与副本

    一. 什么是视图和副本 视图:可理解为原有数据的一个别称或引用(但是这个引用和赋值产生的引用不同),通过该别称或引...

  • NumPy 数组对象

    NumPy 数组对象 数组索引和切片 内存布局 副本和视图 数组创建 数据类型

  • 2019-07-28

    NumPy - 副本和视图 在执行函数时,其中一些返回输入数组的副本,而另一些返回视图。 当内容物理存储在另一个位...

  • NumPy 高级索引和数组概念

    NumPy 高级索引和数组概念 调整图像尺寸 创建视图及副本 翻转图像 花式索引 将位置列表用于索引 布尔索引 分...

  • Numpy

    非副本视图的子视图

  • python的学习笔记11

    16、副本与视图 16.1简单赋值 它不会创建数组对象的副本,同时可以通过id()函数去访问,将一个数组的变化都反...

  • Numpy学习笔记(三)

    【转载】Numpy教程 复制与视图 完全不拷贝简单的赋值不拷贝数组对象或它们的数据 视图(view)和浅复制不同的...

  • Oracle物化视图的用法与总结

    物化视图(material view)是什么? 物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,...

  • numpy运算

    numpy的与运算 numpy 中 argsort() numpy 中的布尔索引

  • (三)Numpy 数据存取与函数|python数据分析与展示(学

    数据的CSV文件存取-Numpy 数据存取与函数 1多维数据的存取-Numpy 数据存取与函数 2Numpy的随机...

网友评论

    本文标题:Numpy的视图与副本

    本文链接:https://www.haomeiwen.com/subject/harlvftx.html