NumPy(八): 副本和视图&IO

Android 13 系统定制:实现第三方Launcher预置与原生Launcher3的共存切换 本文详细介绍了在Android 13系统中实现第三方Launcher预置与原生Launcher3共存切换的技术方案。通过修改ResolverActivity逻辑、处理首次启动设置以及优化用户切换机制,开发者可以灵活定制默认Launcher,同时保留用户自由选择权。文章还提供了常见问题排查指南和性能优化建议,帮助提升双Launcher方案的稳定性和用户体验。 阅读详情

NumPy 副本和视图

副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。

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

视图一般发生在:

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

副本一般发生在:

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

无复制

简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。

此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状

>>> import numpy as np 
>>> a = np.arange(6)  
>>> a
array([0, 1, 2, 3, 4, 5])
>>> id(a)
210103936
>>> b = a
>>> b
array([0, 1, 2, 3, 4, 5])
>>> id(b)
210103936
>>> b.shape = 3,2
>>> b
array([[0, 1],
       [2, 3],
       [4, 5]])
>>> a
array([[0, 1],
       [2, 3],
       [4, 5]])

视图或浅拷贝

ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数更改不会更改原始数据的维数

>>> a = np.arange(6).reshape(2,3)
>>> print(a)
[[0 1 2]
 [3 4 5]]
>>> b = a.view()
>>> print(b)
[[0 1 2]
 [3 4 5]]
>>> id(a)
209561264
>>> id(b)
210104096
>>> b.shape = 3,2
>>> print(b)
[[0 1]
 [2 3]
 [4 5]]
>>> print(a)
[[0 1 2]
 [3 4 5]]

使用切片创建视图修改数据会影响到原始数组:

>>> arr = np.arange(12)
>>> print (arr)
[ 0  1  2  3  4  5  6  7  8  9 10 11]
>>> a=arr[3:]
>>> b=arr[3:]
>>> print(a)
[ 3  4  5  6  7  8  9 10 11]
>>> print(b)
[ 3  4  5  6  7  8  9 10 11]
>>> a[1] = 123
>>> b[2] = 345
>>> print(arr)
[  0   1   2   3 123 345   6   7   8   9  10  11]
>>> print(id(a),id(b),id(arr[3:]))
54438752 210103936 210104096

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

副本或深拷贝

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

>>> a = np.array([[10,10],  [2,3],  [4,5]])  
>>> print (a)
[[10 10]
 [ 2  3]
 [ 4  5]]
>>> b = a.copy()  
>>> print (b)
[[10 10]
 [ 2  3]
 [ 4  5]]
>>> print (b is a)
False
>>> b[0,0]  =  100  
>>> print (b)
[[100  10]
 [  2   3]
 [  4   5]]
>>> print (a)
[[10 10]
 [ 2  3]
 [ 4  5]]

 

IO

Numpy 可以读写磁盘上的文本数据或二进制数据。

NumPy 为 ndarray 对象引入了一个简单的文件格式:npy。

npy 文件用于存储重建 ndarray 所需的数据、图形、dtype 和其他信息。

常用的 IO 函数有:

  • load() 和 save() 函数是读写文件数组数据的两个主要函数,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npy 的文件中。
  • savez() 函数用于将多个数组写入文件,默认情况下,数组是以未压缩的原始二进制格式保存在扩展名为 .npz 的文件中。
  • loadtxt() 和 savetxt() 函数处理正常的文本文件(.txt 等)

numpy.save() 函数将数组保存到以 .npy 为扩展名的文件中。

numpy.save(file, arr, allow_pickle=True, fix_imports=True)

参数说明:

  • file:要保存的文件,扩展名为 .npy,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上。
  • arr: 要保存的数组
  • allow_pickle: 可选,布尔值,允许使用 Python pickles 保存对象数组,Python 中的 pickle 用于在保存到磁盘文件或从磁盘文件读取之前,对对象进行序列化和反序列化。
  • fix_imports: 可选,为了方便 Pyhton2 中读取 Python3 保存的数据。
>>> import numpy as np 

>>> a = np.array([1,2,3,4,5]) 
# 保存到 outfile.npy 文件上
>>> np.save('outfile.npy',a) 
#找不到文件的可以放桌面,看自己桌面路径是啥,改一下
>>> np.save(r'C:\Users\MARS\Desktop\outfile.npy',a)
# 保存到 outfile2.npy 文件上,如果文件路径末尾没有扩展名 .npy,该扩展名会被自动加上
>>> np.save('outfile2',a)

我们可以查看文件内容,win10命令行下:


C:\Users\MARS\AppData\Local\Programs\Python\Python36-32>type outfile.npy
揘UMPYv{'descr': '<i4', 'fortran_order': False, 'shape': (5,), }                                                       

C:\Users\MARS\AppData\Local\Programs\Python\Python36-32>type outfile2.npy
揘UMPYv{'descr': '<i4', 'fortran_order': False, 'shape': (5,), }                                                       

C:\Users\MARS\AppData\Local\Programs\Python\Python36-32>

可以看出文件是乱码的,因为它们是 Numpy 专用的二进制格式后的数据。

我们可以使用 load() 函数来读取数据就可以正常显示了:

>>> b = np.load('outfile.npy')  
>>> print(b)
[1 2 3 4 5]

numpy.savez() 函数将多个数组保存到以 npz 为扩展名的文件中。

numpy.savez(file, *args, **kwds)

参数说明:

  • file:要保存的文件,扩展名为 .npz,如果文件路径末尾没有扩展名 .npz,该扩展名会被自动加上。
  • args: 要保存的数组,可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为 arr_0, arr_1, … 。
  • kwds: 要保存的数组使用关键字名称。
>>> a = np.array([[1,2,3],[4,5,6]])
>>> b = np.arange(0, 1.0, 0.1)
>>> c = np.sin(b)
>>> np.savez("wutenglan.npz",a, b, sin_array = c)
>>> r  = np.load("wutenglan.npz")
>>> print(r)
<numpy.lib.npyio.NpzFile object at 0x0C7D8190>
>>> print(r["arr_0"])
[[1 2 3]
 [4 5 6]]
>>> print(r["arr_1"])
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]
>>> print(r["sin_array"])
[0.         0.09983342 0.19866933 0.29552021 0.38941834 0.47942554
 0.56464247 0.64421769 0.71735609 0.78332691]

savetxt() 函数是以简单的文本文件格式存储数据,对应的使用 loadtxt() 函数来获取数据( 可以直接txt打开查看)。

np.loadtxt(FILENAME, dtype=int, delimiter=' ')
np.savetxt(FILENAME, a, fmt="%d", delimiter=",")

参数 delimiter 可以指定各种分隔符、针对特定列的转换器函数、需要跳过的行数等。

>>> a = np.array([1,2,3,4,5]) 
>>> np.savetxt('xiaoze.txt',a)
>>> b = np.loadtxt('xiaoze.txt')
>>> print(b)
[1. 2. 3. 4. 5.]
C:\Users\MARS\AppData\Local\Programs\Python\Python36-32>type xiaoze.txt
1.000000000000000000e+00
2.000000000000000000e+00
3.000000000000000000e+00
4.000000000000000000e+00
5.000000000000000000e+00

使用 delimiter 参数:

>>> a=np.arange(0,10,0.5).reshape(4,-1)
>>> a
array([[0. , 0.5, 1. , 1.5, 2. ],
       [2.5, 3. , 3.5, 4. , 4.5],
       [5. , 5.5, 6. , 6.5, 7. ],
       [7.5, 8. , 8.5, 9. , 9.5]])
>>> np.savetxt("out.txt",a,fmt="%d",delimiter=",") # 改为保存为整数,以逗号分隔
>>> b = np.loadtxt("out.txt",delimiter=",") # load 时也要指定为逗号分隔
>>> print(b)
[[0. 0. 1. 1. 2.]
 [2. 3. 3. 4. 4.]
 [5. 5. 6. 6. 7.]
 [7. 8. 8. 9. 9.]]
C:\Users\MARS\AppData\Local\Programs\Python\Python36-32>type out.txt
0,0,1,1,2
2,3,3,4,4
5,5,6,6,7
7,8,8,9,9

 

Vins-Fusion 外参camera-imu 标定 Vins-Fusion是一种基于优化的多传感器状态估计器,一大特色是支持实时camera-imu外参校准(相机和IMU之间的旋转)。Vins-Fusion 外参camera-imu校准是利用两帧间计算相机位姿和imu预积分得到位姿,构建最小二乘问题,并通过SVD求解camera-imu外参旋转矩阵。 阅读详情

相关推荐

忆阻器(二)——忆阻模拟器

除了真实的器件,我们也可以用运放和乘法器来搭忆阻模拟器。这节将介绍数学模型、matlab仿真及multisim仿真。 一、数学模型 忆阻分为磁控和荷控两种,这里介绍三次非线性磁控忆阻模型: {I=W(φ)VW(φ)=a+3bφ2dφdt=V \begin{cases} I=W(\varphi)V \\ W(\varphi)=a+3b \varphi ^2\\ \frac{d \varphi }{dt}=V \end{cases} ⎩⎪⎨⎪⎧​I=W(φ)VW(φ)=a+3bφ2dtdφ​=V​ 这里的WWW

http://www.icfgblog.com/ 1万+

NumPy 中 view() (即浅拷贝)

a = b.view() 即为 NumPy 中的浅拷贝. 可以参考 python的numpy的浅拷贝的作用是什么? 中的回答: python的numpy的浅拷贝的作用是什么? - 泰克尼客的回答 - 知乎 https://www.zhihu.com/question/324799161/answer/874246912 总结一下就是: a=b.view(), 这时, a 和 b 会共享同一个数据区, 但是它们是不同的对象, 如果修改 a 的数据, 会影响到 b, 但如果仅仅是修改 a 的一些性质, 例如

米饭的白色的专栏 2836

AD20/Altium designer——如何进行DRC检查、冲突的错误如何改正

对于一个画完的PCB,我们常常需要进行DRC检查,确保板子的电器连接及制作工艺在设定规则的范围内,本篇将介绍如何对PCB进行后期DRC检查处理,确保电路板出现不必要错误。 1.DRC检查入口 2.DRC设置 3.错误分析 对于错误的内容,依据个人实际情况不同,其出现的原因都是因为与设计规则中的设定标准冲突,这里按遇到的错误进行修改讲解,其他错误同理。 4.常见错误分析及解决方法 (1) 解决方法:将未连接网络连接(...

嵌入式创客工坊的博客 5万+

numpy中view详解

1、如何判断是否共享内存 方法一: a = np.arange(50) b = a.reshape((5, 10)) print (b.base is a) 方法二: print (np.may_share_memory(a, b)) 方法三: print (b.flags['OWNDATA']) #False -- apparently this is a view e

Jfuck的专栏 3万+

别再让地图加载慢吞吞!GeoServer + GeoWebCache 缓存配置实战(附性能对比)

本文详细介绍了如何通过GeoServer和GeoWebCache优化地图服务性能,实现地图加载速度的显著提升。从缓存机制解析到实战配置流程,再到高级性能调优技巧,帮助开发者构建高效地图缓存系统,解决地图加载慢的问题。

weixin_42525369的博客 407

(3万字深度解析)Kaggle《房价预测:高级回归技巧》详解复现攻略

在这篇教程式文章中,我们从零开始完成了 Kaggle《房价预测:高级回归技巧》比赛的复现工作,涵盖了数据预处理、特征工程、模型训练、调优、解释和融合的完整流程。深入理解数据:阅读数据描述,结合常识对每个特征作出合理处理(如缺失值填充’None’表示无此设施 、异常值剔除 等)。对目标和偏态特征进行对数变换,使分布更平滑,从而更好满足模型假设并提升准确度。特征工程:我们创造了总面积、总浴室等新特征,整合信息提高模型可学习性。

qq_38334677的博客 1775

Numpy中的View()和copy()

【代码】Numpy中的View()和copy()

qq_39339172的博客 793

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 406

NumPy入门 之 数组初探: 图解view和copy (上)

图解NumPy中的视图view和拷贝copy。

coolend的专栏 2773

Keil-C51 与 Keil -ARM 共存的方法

本篇为《嵌入式相关》系列博客的第五篇,该系列博客主要记录单片机开发及硬件设计的相关过程,方便以后查阅。 Keil-C51 与 Keil -ARM 共存的方法状况解决方案1测试解决方案2 状况 今天装完Keil-C51,然后又换装了Keil-ARM之后,可以正常编译STM32 的工程,但是无法编译C51的工程,并且出现了如下错误: *** Error: Project ‘template’ requires ‘C51’ Toolchain which is not installe 这种情况就是Keil-

梁小憨憨的博客 1万+

【Cmder】--- Windows11 配置CMD神器 (超详细 持续更新中)

在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

秋知叶i 1万+

关于numpy与torch的各自变量的.view()方法

当使用NumPy和PyTorch时,两者都具有类似的.view()方法,用于改变数组或张量的形状,但它们在一些方面有所不同。下面是关于这两个库的.view()方法的教程

weixin_46016933的博客 1100

第十二段:基于env的重用

现代芯片的验证通常分为两个层次, 一是模块级别( block level, 也称为IP级别、 unit级别) 验证, 二是芯片级别( 也称为SOC级别) 验证。 一个大的芯片在开发时, 是分成多个小的模块来开发的。 每个模块开发一套独立的验证环境, 通常每个模块有 一个专门的验证人员负责。 当在模块级别验证完成后, 需要做整个系统的验证。 假设某个系统分成了三个模块,如下图: 这三个模块在模块级别验证时, 分别有自己的driver和s...

年糕的博客 423

numpy 笔记 view,copy和numpy的运行速度

1 ndarray VS python-list Numpy 就是 C 的逻辑, 创建存储容器Array的时候是寻找内存上的一段连续空间来存放 Python 存放的时候则是不连续的区域(只是它用索引将这些区域联系起来了), 这使得 Python 在索引这个容器里的数据时不是那么有效率 2 View & Copy Copy 顾名思义, 会将 Array 中的数据 copy 出来存放在内存中另一个地方 View 不 copy 数据, 而是给源数据加一个窗(视图),从外面看窗户里的数...

qq_40206371的博客 907

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

numpy关于视图和副本的区别

numpy在数据处理时的优势时显而易见的,谈到numpy,会经常听到关于视图和副本的说法,今天就来记录一下视图个副本的区别。 首先讲一下两者的定义: 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。 视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。 理解这个定义其实可以参考python的深浅拷贝的概念,副本其实就是类似于深拷贝,是完...

学习python 1077

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Numpy视图

当创建一个 NumPy 数组的视图时,视图并不是一个独立的数组,而是原始数组的一个“窗口”或“引用”。视图和原始数组共享相同的数据缓冲区,这意味着对视图所做的任何修改都会直接影响原始数组,反之亦然。

qq_62784677的博客 1196

numpy中的copy(副本)和view(视图)

numpy中的copy(副本)和view(视图)

听海边涛声 713

python中view()函数怎么用?

初学者在使用pytorch框架定义神经网络时,经常会在代码中看到: 这样的用法。 view()的作用相当于numpy中的reshape,重新定义矩阵的形状。例如: import torch a = torch.range(1, 16)

知乎 8万+

python中 numpy f.view(‘f8,f8,f8,f8‘)函数说明

view函数参数

qq_35568823的博客 919

numpy中的view和copy

我们知道numpy的数据其实是一块连续的内存空间,我们在操作的时候需要注意我们操作的是view还是copy,否则的话,我们可能会修改我们不希望修改的数据。 view只是一个指向同一块内存的指针而已,两者相互影响 copy是把原始内容copy了一份,两者不相互影响 Numpy中的基础slice都只是创建一个view 使用slice之后,你可以使用以下的一些方法来判断两个不同的array是否共享数据 np.may_share_memory/np.shares_memory ndarray.base是否相等

贾亮的专栏 810

numpy .npz文件处理

numpy .npz文件处理0 问题引入1 读取文件2保存为.npz文件功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 0 问题引入 前两天从在GitHub下载了一个代码,其中的数据集是.npz结尾的文件,之前没有见过不知道如何处

weixin_36979214的博客 1万+

Python学习-numpy高级之矩阵点积vdot函数

Numpy高级函数之矩阵点积操作vdot函数 矩阵点积为两个矩阵对应元素乘积之和 首页导入numpy #导入numpy import numpy as np 定义两个矩阵a和b #定义两个矩阵 a=np.array([[4,3],[5,6]]) b=np.array([[10,11],[12,13]]) print("a") print(a) print("b") print(...

qq_19979101的博客 4809

Numpy线性代数-numpy.vdot()

前言 N u m P y NumPy NumPy提供了线性代数函数库linalg,该库包含了线性代数所需的所有功能,可以看看下面的说明。 函数 内容 dot 两数组的点积 vdot 两向量的点积 inner 两数组的内积 determinant 数组的行列式 matmul 两数组的矩阵积 inv 求矩阵的逆 solve 求解线性矩阵方程 相关函数介绍 numpy.dot(): numpy.vdot(): numpy.inner(): numpy.determinant(): numpy.matmul():

geinvse_seg的博客 2485

【NumPy】深入解析numpy中的vdot 方法

numpy.vdot函数接受两个数组作为输入,并计算它们的逐元素乘积后求和的结果。这个方法在概念上类似于点积,但计算方式不同。NumPy 的vdot方法为计算两个向量的逐元素乘积后求和提供了一种高效且易于使用的接口。本文介绍了vdot方法的基本概念、使用方法以及它在解决实际问题中的应用。希望本文能够帮助您更好地理解和运用逐元素乘积后求和的运算。

2402_83361138的博客 845

【NumPy进阶】:内存视图、性能优化与高级线性代数

内存视图与拷贝:理解何时使用视图、何时使用拷贝。性能优化技巧:利用向量化、合适的数据类型和并行计算来提升性能。高级线性代数运算:使用np.linalg模块解决复杂的线性代数问题。继续练习这些概念和技巧,将帮助你在数据科学、机器学习和科学计算领域更上一层楼!

2301_82023330的博客 1499

python包-numpy数据读取和保存(二)

目录 0.为什么要使用numpy保存数据 1.保存为二进制文件(.npy/.npz)并读取 numpy.save和numpy.load numpy.savez numpy.savez_compressed 2.保存到文本文件 numpy.savetxt numpy.loadtxt numpy.genfromtxt numpy.fromregex numpy.fromfile和...

ypfzhao 1万+

view函数--python

view()的作用相当于numpy中的reshape,重新定义矩阵的形状。 import torch x=torch.randn(4,4) print(x) tensor([[-1.2099, 1.0978, 1.0094, 1.3966], [ 0.2889, -0.5096, 1.8754, 0.7503], [ 1.8894, 1.7621, -1.3559, 0.5547], [ 0.4342, -0.3919, 0.0501, 0.0693]]) y=x.view(16) pr

weixin_34280060的博客 1万+
上一篇: NumPy(七): 统计函数&排序、条件函数
下一篇: Numpy(九): Matplotlib
AA赵师傅
博客等级 码龄9年 89粉丝 124原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值