Python数值计算(1)——Numpy中数据的保存和加载

这里讨论一下在进行数值计算中,对计算数据的保存和加载。

1. 文本格式

这种方式可以采用文本的方式保存numpy数组,函数原型如下:

numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', 
newline='\n', header='', footer='', comments='# ', encoding=None)

其中fname是文件名称,如果文件名以.gz结尾,numpy会 自动将其作为gzip文件压缩,X是需要保存的数组,fmt是保存的格式,delimiter是数据之间的分隔符,newline是换行符,header和footer是放在数据之前和之后的注释,而comment则是注释的引导符,默认为#,这也是Python中的注释符。例如保存一个多维数组,代码如下:

a=np.linspace(1,2,5)np.savetxt('test.txt',a,header='header of array',footer='footer of array',encoding='utf-8')

输出文件test.txt内容为:

# header of array
1.000000000000000000e+00
1.250000000000000000e+00
1.500000000000000000e+00
1.750000000000000000e+00
2.000000000000000000e+00
# footer of array

加载这种保存的文档使用loadtxt,函数原型为:

numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', 
delimiter=None, converters=None, skiprows=0, usecols=None, 
unpack=False, ndmin=0, encoding=None, max_rows=None, *, 
quotechar=None, like=None)

fname是文件名,如果后缀是.gz或者.bz2,文件会被先解压,另外需要注意的是加载时comments、delimiter和encoding务必要和前面存盘时保持一致,如果前面存盘时都保持默认值,可以只提供一个文件名,例如:

a=np.linspace(1,2,5)
np.savetxt('test.txt',a)
del a
na=np.loadtxt('test.txt')
print(na) # [1.   1.25 1.5  1.75 2.  ]

这种方式的优点是具有可读性,也便于和其他程序进行数据交互。

2. 二进制格式

第二种方式保存二进制格式,使用numpy.save函数,可以将数组保存为*.npy格式的文件,函数原型如下:

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

前面两个参数分别是文件名和数组,后面两个选项通常保持默认值即可。例如,数据存盘:

a=np.linspace(1,2,5)
np.save('bin',a)

可以看到会生成一个名为bin.npy的文件(函数会自动添加后缀),所保存的文件已经不具有可读性:

加载使用numpy.load函数,其原型如下:

numpy.load(file, mmap_mode=None, allow_pickle=False, 
fix_imports=True, encoding='ASCII', *, max_header_size=10000)

加载时提供之前存盘的文件名即可,注意,必须显式提供后缀.npy。

a=np.linspace(1,2,5)
np.save('bin',a)
del a
na=np.load('bin.npy')
print(na) # [1.   1.25 1.5  1.75 2.  ]

save和load也支持多个数组的保存和加载,此时,提供给这两个函数的是文件,应该是一个使用二进制打开的文件标识符,例如,保存两个数组:

a=np.linspace(1,2,5)
b=np.arange(1,2,0.25)
with open('bin2.npy','wb') as f:np.save(f,a)np.save(f,b)

从这两个数组中加载数据:

na=nb=None
with open('bin2.npy','rb') as f:na=np.load(f)nb=np.load(f)
print(na) # [1.   1.25 1.5  1.75 2.  ]
print(nb) # [1.   1.25 1.5  1.75]

3. 多个数组的保存和加载

前面提到了使用save和load实现多个数组的保存和加载,针对这种需求,numpy中还有专门的savez函数,可以实现对多个.npy文件的打包形成*.npz文件,并且在加载后,可以像字典一样操作。

例如,同样保存前面两个数组:

a=np.linspace(1,2,5)
b=np.arange(1,2,0.25)
np.savez('zfile.npz',za=a,zb=b)

函数中za,zb是自定义的字符串,可以理解为是这个数组的别名,或者说是字典中的键。如果存盘时没有提供这些值,则savez函数会为存盘的数组依次取名arr_0,arr_1等。

加载依旧使用load函数,事实上,该函数返回一个NpzFile对象,可以通过类似访问字典的方式,获取其中的数据:

zf=np.load('zfile.npz')
aa=zf['za']
bb=zf['zb']
print(aa)
print(bb)

如果提供了一个不存在的键,会导致产生异常:raise KeyError("%s is not a file in the archive" % key),为了避免这样的问题,可以先通过Npzfile对象的属性files获取可用的数组名:

zf=np.load('zfile.npz')
print(zf.files) # ['za', 'zb']

4. 带数据压缩的存盘和加载

前面提到的.npz文件,只是做了归档,并未对数据进行压缩,在一些存储空间比较紧张的场合,还可以使用带压缩的存盘和加载,函数numpy.savez_compressed可以实现这一功能,其使用方式和savez一样,但是内部使用了压缩算法,缩减了数据的存盘空间。以下测试了空间的利用率:

import numpy as np
import os
'''
测试压缩率'''
for i in range(0,5):N=10**irng=np.random.rand(N,N)file1='z1.npz'file2='z2.npz'np.savez(file1,rng)np.savez_compressed(file2,rng)size1=os.path.getsize(file1)size2=os.path.getsize(file2)print(f'N={N},Size1={size1},Size2={size2},Ratio={size2/size1*100:5.2f}%')

某次的运行结果为:

N=1,Size1=272,Size2=215,Ratio=79.04%
N=10,Size1=1064,Size2=1024,Ratio=96.24%
N=100,Size1=80264,Size2=75632,Ratio=94.23%
N=1000,Size1=8000264,Size2=7544290,Ratio=94.30%
N=10000,Size1=800000264,Size2=754412539,Ratio=94.30%

可见对于这种稠密的数组,压缩效果并不明显,大概在95%左右

但是,如果是稀疏数组呢?效果如何?编写一个生成稀疏数组的函数:

def sparse_gen(m,n,ratio):ret=np.zeros((m,n))total=int(m*n*ratio)cnt=0while cnt<total:r=np.random.randint(m)c=np.random.randint(n)d=np.random.randint(1,10)if ret[r,c] ==0:ret[r,c]=dcnt+=1return ret

将原来代码中:

rng=np.random.rand(N,N)

替换为:

rng=sparse_gen(N,N,0.1)

再次运行,这次的结果如下:

N=1,Size1=272,Size2=209,Ratio=76.84%
N=10,Size1=1064,Size2=250,Ratio=23.50%
N=100,Size1=80264,Size2=2814,Ratio= 3.51%
N=1000,Size1=8000264,Size2=249132,Ratio= 3.11%
N=10000,Size1=800000264,Size2=24855059,Ratio= 3.11%

可见,在一个稠密度为10%的数组中,压缩率大概为3.1% ~ 3.5%,数据越多,压缩率越显著。

如果修改生成数组的稠密度为5%(这个通常是稀疏矩阵的临界值),则压缩率最终可以达到约2%的水平:

N=1,Size1=272,Size2=209,Ratio=76.84%
N=10,Size1=1064,Size2=236,Ratio=22.18%  
N=100,Size1=80264,Size2=1814,Ratio= 2.26%
N=1000,Size1=8000264,Size2=152801,Ratio= 1.91%
N=10000,Size1=800000264,Size2=15262699,Ratio= 1.91%

所以,总结下来就是,对于稠密数组而言,使用savez就足够了,只有在类似稀疏数组时,压缩存盘的空间效果才会比较显著。但是,对于稀疏矩阵而言,通常不会直接存储,而是用其他表示方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/389179.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET 一款反序列化打入冰蝎内存马的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

开源项目的发展趋势,以及参与开源项目可以获得的经验和成果,以及涉及到的注意事项

目录 一、当前开源项目的发展趋势 1. 全球化协作与社区增长 2. 多领域技术创新与迭代加速 3. 开放协作模式 4. 商业化与产业融合 5. 安全性与隐私保护 6. 跨界融合与生态构建 7. 政策支持 二、参与开源项目的经验和收获 1. 技术能力提升 2. 团队协作与沟通能力 3.领…

大数据技术基础编程、实验和案例----大数据课程综合实验案例

一、实验目的 (1&#xff09;熟悉Linux系统、MySQL、Hadoop、HBase、Hive、Sqoop、R、Eclipse等系统和软件的安装和使用&#xff1b; (2&#xff09;了解大数据处理的基本流程&#xff1b; (3&#xff09;熟悉数据预处理方法&#xff1b; (4&#xff09;熟悉在不同类型数据库之…

Java未来还是霸主吗?Java 在当今企业中的未来到底是什么?

Java 及其生态系统对于许多现代企业的成功至关重要。它是一种多功能语言&#xff0c;对许多用例提供强大支持&#xff0c;并具有强大的新功能来应对棘手的情况。但您可能会问自己&#xff1a;Java 的未来是什么&#xff1f; 尽管自 1999 年以来 Java 一直是软件开发领域的关键角…

elementUI,vue,前端判断时间是否有交集(重合)方法

分成三个部分 html※ 具体实现方法methods帮助理解逻辑图&#xff1a;![smallredBook&#xff1a;灵魂画手&#xff0c;业余爱好支持支持](https://i-blog.csdnimg.cn/direct/665950ee60964ef8912ce4f1a98dcc0e.jpeg#pic_center) 简化&#xff1a;由上面的逻辑反推[^1] html &…

FreeRTOS互斥量

文章目录 一、互斥量的使用场合二、互斥量函数1、创建2、其他函数 三、示例: 优先级继承四、递归锁1、死锁的概念2、自我死锁3、函数 怎么独享厕所&#xff1f;自己开门上锁&#xff0c;完事了自己开锁。 你当然可以进去后&#xff0c;让别人帮你把门&#xff1a;但是&#xff…

无人机环保行业解决方案-应急环境污染处理

无人机环境应急处理 传统环境应急的典型挑战 发生环境应急事件时&#xff0c;最重要的是快速获取前方信息。然而&#xff0c;有毒气体 和易燃易爆品多&#xff0c;存在二次爆炸风险&#xff0c;严重威胁人身安全。无人机可快 速赶到事故现场&#xff0c;查看周边环境、污染物…

单火供电零线发生器 单火变零火线开关面板零火开关老房改造必备

创作 史新华 零线发生器套件与单火线供电套件&#xff0c;作为现代智能家居解决方案中的创新之作&#xff0c;它们犹如智能电气领域的魔术师&#xff0c;巧妙地解决了传统智能开关在单火线路环境中因无零线而难以应用的难题。这些套件&#xff0c;如同智能电气世界的桥梁&…

【守卫你的安全】基于高通QCS6490之AI智慧电子围篱展示方案

高通QCS6490是一款专为工业和商业物联网应用而设计的系统单芯片(SoC)&#xff0c;支援高阶物联网装置的Wi-Fi 6E连线&#xff0c;以及先进的摄像头、人工智能和计算功能&#xff0c;以实现低功耗下的强大性能。这款芯片结合高通Kryo™ 670 CPU和高通Hexagon处理器&#xff0c;具…

芋道源码yudao-cloud 二开日记(商品sku数据归类为规格属性)

商品的每一条规格和属性在数据库里都是单一的一条数据&#xff0c;从数据库里查出来后&#xff0c;该怎么归类为对应的规格和属性值&#xff1f;如下图&#xff1a; 在商城模块&#xff0c;商品的单规格、多规格、单属性、多属性功能可以说是非常完整&#xff0c;如下图&#x…

【前端逆向】最佳JS反编译利器,原来就是chrome!

有时候需要反编译别人的 min.js。 比如简单改库、看看别人的 min,js 干了什么&#xff0c;有没有重复加载&#xff1f;此时就需要去反编译Javascript。 Vscode 里面有一些反编译插件&#xff0c;某某Beautify等等。但这些插件看人品&#xff0c;运气不好搞的话&#xff0c;反…

Postman:API开发与测试的强大伴侣

在当今的数字化时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为不同软件系统之间通信的桥梁&#xff0c;它们如同数字世界的“翻译官”&#xff0c;使得数据和服务能够在不同的平台和应用程序之间无缝流动。然而&#xff0c;API的开发、测试和维护并非易事…

见证中国数据库的崛起:从追赶到引领的壮丽征程《三》

见证中国数据库的崛起&#xff1a;从追赶到引领的壮丽征程《三》 三、深度思考&#xff1a;中国数据库发展的经验与启示产学研用结合的创新模式应用驱动的创新路径人才培养的关键作用 【纪录片】中国数据库前世今生 在数字化潮流席卷全球的今天&#xff0c;数据库作为IT技术领域…

PowerDNS架构解析与安装部署指南

1、背景介绍 目前公司使用PowerDNS进行DNS管理&#xff0c;但由于采用的是单节点架构&#xff0c;存在不可用的风险。为提升系统的稳定性和可靠性&#xff0c;我们计划对现有架构进行重构。通过引入高可用性设计&#xff0c;我们将优化系统架构&#xff0c;使其能够在故障情况…

计算机毕业设计Python+Flask微博舆情分析 微博情感分析 微博爬虫 微博大数据 舆情监控系统 大数据毕业设计 NLP文本分类 机器学习 深度学习 AI

基于Python/flask的微博舆情数据分析可视化系统 python爬虫数据分析可视化项目 编程语言&#xff1a;python 涉及技术&#xff1a;flask mysql echarts SnowNlP情感分析 文本分析 系统设计的功能&#xff1a; ①用户注册登录 ②微博数据描述性统计、热词统计、舆情统计 ③微博数…

Python酷库之旅-第三方库Pandas(060)

目录 一、用法精讲 231、pandas.Series.reorder_levels方法 231-1、语法 231-2、参数 231-3、功能 231-4、返回值 231-5、说明 231-6、用法 231-6-1、数据准备 231-6-2、代码示例 231-6-3、结果输出 232、pandas.Series.sort_values方法 232-1、语法 232-2、参数…

springboot的表现层/控制层controller开发

第一步&#xff1a;新建文件和注入业务层对象 需要使用的注解&#xff1a; 第一个声明是restful风格开发 第二个是需要设置网页访问路径 RestController RequestMapping("/fuels")//http://localhost/fuels注入服务层对象&#xff1a; Autowiredprivate FuelServ…

RabbitMQ知识总结(基本概念)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 基本概念 Producer&#xff1a; 消息的生产者&#xff0c;是一个向…

活动报道 | 盘古信息携IMS OS+小快轻准产品集亮相东莞市中小数转试点供需对接会

8月1日&#xff0c;由东莞市工业和信息化局主办&#xff0c;南城街道经济发展局承办&#xff0c;东莞市软件行业协会协办的东莞市中小企业数字化转型城市试点供需对接会&#xff08;城区和水乡新城片区&#xff09;隆重召开。市工业和信息化局副局长江小敏、市工业和信息化局信…

Mybatis超级方便操作数据方式(注解+封装mapper接口)!!!

Mybatis作为一个流行的持久层框架&#xff0c;其优化了Java程序与数据库的交互过程。它的核心在于使用Mapper接口与XML映射文件或注解绑定来实现对数据库的操作。这种方式不仅简化了数据库操作&#xff0c;还提升了开发效率&#xff0c;使得开发者可以从繁琐的JDBC代码中解放出…