我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python numpy视图与副本

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python numpy视图与副本

前言:

继上一篇对numpy 模块之ndarray一文中对 ndarray 内存结构主要分为两部分:

metdata :存放数组类型dtype、数组维度ndim、维度数量shape、维间距strides等
raw bata:存放原始数据data

metdata 中包含着关于数组相关信息,可以帮助我们在数组ndarray中快速索引和解释指定的数据

除此了对数组进行索引操作外,也会对数组的原数据进行类似与之前“拷贝”操作。

众所周知,在 Python 中大家应该对深浅拷贝有一定的印象吧,在 numpy 中则换成了“视图”与“副本”的概念了。

相信大家和我一样对此存在疑问,十万个为什么涌上心头了,“视图是什么?”,“什么是副本?”

因此,本期我们一起来学习 numpy 模块中比较新奇的概念视图与副本,Let's go~

1. 简单讲解

我们之前在学习 Python 赋值、深浅拷贝时,在代码添加中对比两个对象的地址id()是否一致。

同理,按照这样的思路,numpy 中也可以对比两个数组地址是否一样。

同时,在 numpy 数组对象ndarray 也提供许多字段,方便让我们进一步地查看数组内部的差异

ndarray.flags : 查看数组存储策略、读写权限、对象等

  • C_CONTIGUOUS (C) 行优先存储
  • F_CONTIGUOUS 列优先存储
  • OWNDATA 数据所有者
  • WRITEABLE 编写权限
  • ALIGNED 数据元素与硬件指针对齐
  • WRITEBACKIFCOPY 数组是其他数组的副本
  • UPDATEIFCOPY 已弃用

注:flags 相关属性名称可以单独调用例如 flags.writeable

  • ndarray.base : 查看数组中的元素是否来自其他数组
  • ndarray.nbytes: 查看数组中数据占用的字节数
  • getsizeof(item): 查看数组占用的内存空点

介绍完上述指标,我们来小试一下:

>>> import numpy as np
>>> a = np.array([1,2,3,4])
>>> print(a[1:3])
[2 3]
>>> print(a[[1,2]])
[2 3]
>>>

查看a[1:3] 与 a[[1,2]] 内存地址,它们俩位置不一样,a[[1,2]]意味发生了深拷贝本(副本),a[1:3] 是原数组a引用(视图)

>>> print(id(a[1:3]))
2247482965008
>>> print(id(a[[1,2]]))
2247482964928

查看ndarray.owndata 属性,发现a[1:3] 数据来自a数组的,而a[[1,2]]是自身数据的

>>> print(a.flags.owndata)
True
>>> print(a[1:3].flags.owndata)
False
>>> print(a[[1,2]].flags.owndata)
True

我们在看一下 ndarray.base 属性,果真印证了使用flags.owndata 查询的结果,a[1:3] 不是数据所有者,而数据来源数组a;

a[[1,2]] 是数据所有者,数据来源本身(None)

>>> print(a[[1,2]].base)
None
>>> print(a[1:3].base)
[1 2 3 4]

2. 视图

视图概念

我们通过上述简单例子,可以知道 a[1:3] 不是数据所有者,数据来源于对数组a的引用(浅拷贝)。

因此,我们应该对视图有了基本的认识了,看一下官方怎么描述视图的

No copy at All。 Simple assignments make no copy of objects or their data.

视图,是对原数组进行引用拷贝,共享原始数组的数据。

视图应用

视图在numpy中广泛使用,视图一般产生有两种场景:

  • 当对原始数组进行引用时
  • 当自身无数据,与原数组共享数据时
>>> import numpy as np
>>> a = np.array([1,2,3,4])
>>> b = a
>>> b is a
True
>>> id(a)
2247207679680
>>> id(b)
2247207679680
>>>

我们可以看到 a 与 b 是 同享同一个数据空间的

numpy 模块诸如索引、切片、函数view(),reshape()等返回视图结果

>>> arr = np.arange(10)
>>> arr_view = arr.view()
>>> arr.shape = (2,5)
>>> arr_reshape = arr.reshape(5,2)
# ndarray.base 属性
>>> print(arr.base)
None
>>> print(arr_view.base)
[[0 1 2 3 4]
 [5 6 7 8 9]]
>>> print(arr_reshape.base)
[[0 1 2 3 4]
 [5 6 7 8 9]]
# ndarray.flags.owndata 属性
>>> print(arr.flags.owndata)
True
>>> print(arr_view.flags.owndata)
False
>>> print(arr_reshape.flags.owndata)
False
>>>

视图优点

在 numpy 中 视图可以创建的对象可以节省内存空间,并且无需复制,提高查询速度

在视图中,创建的对象如果修改数据,原始数据也被修改。

3. 副本

副本概念

副本是对原数组进行完整拷贝(数据地址也会拷贝新的),与原始数组完全独立,相对于“深拷本”,不与原始数组共享数据。

同样截取官网,对副本的描述:

Deep Copy The copy method makes a complete copy of the array and its data

当改变副本的数据元素值时,虽然改变了副本与原数组相互独立,原始数组中元素值不会发生改变。

副本应用

  • 当进行切片操作时
  • 当需要与原始数组数据独立时

副本的实现我们可以直接使用 ndarray.copy()方法对原数组进行深拷贝

b = np.array([2,5,7])

c = b.copy()

c[1] = 8

print("b:",b)
print("c:",c)

print("c is b:",c is b)

# 查看 ndarray.base 属性å
print("b.base:",b.base)
print("c.base:",c.base)

# 查看 ndarray.flags.owndata
print("b.flags.owndata:",b.flags.owndata)
print("c.flags.owndata:",c.flags.owndata)

image.png

image.png

总结:

本期,我们对 numpy 模块中重要的概念视图和副本。

  • 视图,相当于浅拷贝,与原数组共享数据。
  • 副本,相当于深拷贝,与原数组数据相互独立

我们可以通过内存地址id()方法,同时借助ndarray.base、ndarray.flags来进一步分析区别

到此这篇关于Python numpy视图与副本的文章就介绍到这了,更多相关Python numpy视图与副本内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python numpy视图与副本

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python numpy视图与副本怎么理解

本篇文章给大家分享的是有关Python numpy视图与副本怎么理解,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言:下面对 ndarray 内存结构主要分为两部分:metd
2023-06-28

Python图像处理之图像与视频处理基础教程

这篇文章主要介绍了Python图像处理之图像与视频处理基础教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-05-15

python图像处理基本操作总结(PIL库、Matplotlib及Numpy)

一、PIL库对图像的基本操作 1、读取图片 PIL网上有很多介绍,这里不再讲解。直接操作,读取一张图片,将其转换为灰度图像,并打印出来。from PIL import Image import matplotlib.pyplot as
2022-06-02

Python可视化Dash工具之plotly基本图形的实现示例

小编给大家分享一下Python可视化Dash工具之plotly基本图形的实现示例,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Plotly Express是对 Plotly.py 的高级封装,内置了大量实用、现代的绘图模板
2023-06-14

MyBatis视图与数据库备份恢复中的备份数据版本管理

MyBatis是一个半自动ORM映射工具,它主要用于简化数据库操作,提高开发效率,并不直接涉及数据库备份恢复中的备份数据版本管理。数据库备份恢复中的备份数据版本管理主要依赖于数据库管理系统(DBMS)提供的工具或第三方工具来实现。以下是关于
MyBatis视图与数据库备份恢复中的备份数据版本管理
2024-10-14

MyBatis视图设计如何平衡数据备份恢复的成本与效益

MyBatis是一个持久层框架,它本身并不直接涉及数据备份与恢复的设计。数据备份与恢复的策略通常由数据库管理系统(DBMS)和应用架构来设计和实施。以下是关于数据备份恢复的相关信息:数据备份恢复的成本与效益备份与恢复成本概述:数据备份成本
MyBatis视图设计如何平衡数据备份恢复的成本与效益
2024-10-14

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录