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

news2025/1/4 18:52:18

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

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**i
    rng=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=0
    while 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]=d
            cnt+=1
    return 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.coloradmin.cn/o/1969550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全源最短路问题:Floyd算法详解【经典算法,限时免费】

文章目录 最短路问题概述带边权的图的全源最短路径Floyd算法解决全源最短路问题dist数组初始化dist数组迭代以及动态转移方程Floyd算法求解dist数组完整代码pythonjavacpp时空复杂度 *Floyd算法正确性证明证明过程初始情况归纳假设归纳步骤终止条件 完整证明 相关题目 最短路问…

log4j2 远程代码执行漏洞复现(CVE-2021-44228)

目录 一、相关概念 二、漏洞复现 步骤一&#xff1a;执行一下命令启动靶场环境并在浏览器访问&#xff01;&#xff01;&#xff01; 1.启动命令 2.访问网址 步骤二&#xff1a;先在自己搭建的DNSLOG平台上获取一个域名来监视我们注入的效果... 步骤三:可以发现 /solr/ad…

小米手机通知栏横条无法清除 刻晴主题 历史通知记录功能使用方案

问题环境&#x1f495; Root K50 Ultra HyperCeiler &#xff08;系统修改&#xff09; Lspose&#xff08;框架&#xff09;魔改刻晴主题&#xff08;自用&#xff09;隐藏&#xff08;最近任务&#xff09;后台 在搞机过程中出现过如下情况 通知条无法被清除&#xff0c;导…

本地索引和全局索引视图测试

1、创建分区表 CREATE TABLE "OSGIC"."TT" ( "ID" VARCHAR2(32) NOT NULL ENABLE, "BUSS_ID" VARCHAR2(64), "REEST_TIME" DATE ) PARTITION BY RANGE ("REEST_TIME") INTERVAL(NUMTOYMINTERVAL(1, MONTH)) (…

Redis部署策略

文章目录 Redis部署策略单机部署主从复制哨兵模式Redis集群 Redis部署策略 部署方式描述单机部署适用于对数据可靠性要求不高、规模较小的应用。部署简单&#xff0c;但没有冗余和高可用性。主从复制数据从主节点同步到一个或多个从节点&#xff0c;提升读性能和数据备份能力。…

堆的实现-向上调整算法-向下调整算法-堆排序-TopK问题 C语言

一、堆的概念及结构 二、 向上调整算法 注意:循环条件不可写parent > 0 //向上调整算法 //child为下标 void adjustup(int* a, int child) {int parent (child - 1) / 2;while (child > 0){if (a[child] < a[parent]){swap(&a[child], &a[parent]);child pa…

免费开源的私人笔记项目,极空间搭建全平台笔记和待办事项『Joplin』

免费开源的私人笔记项目&#xff0c;极空间搭建全平台笔记和待办事项『Joplin』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 我想很多小伙伴都有记录笔记或者备忘的习惯&#xff0c;其实目前市面可用的这类应用还是很多的&#xff0c;比如印象笔记&#xff0c;有道云笔记。作为…

文件解析漏洞集合

IIS解析漏洞 IIS6 目录解析 在网站下建立文件夹的名字为.asp/.asa 的文件夹&#xff0c;其目录内的任何扩展名的文件都被IIS当作asp 文件来解析并执行。 这里显示的是 1.asp下的1.jpg&#xff0c;按照道理来说里面的文件是一个图片&#xff0c;但是访问的话&#xff0c;会出…

SpringBoot面试题整理(1)

面试整理 前置知识 ApplicationContextInitializerApplicationListenerBeanFactoryBeanDefinitionBeanFactoryPostProcessorAwareInitializingBean/DisposableBeanBeanPostProcessor 面试题 SpringBoot启动流程IOC容器初始化流程Bean声明周期Bean循环依赖SpringMVC执行流程…

JavaEE 初阶(13)——多线程11之“定时器”

目录 一. 什么是“定时器” 二. 标准库的定时器 三. 定时器的实现 MyTimer 3.1 分析思路 1. 创建执行任务的类。 2. 管理任务 3. 执行任务 3.2 线程安全问题 四. 拓展 一. 什么是“定时器” 定时器是软件开发中的一个重要组件&#xff0c;类似于一个“闹钟”&#xff0…

【Spring】详细理解Spring中控制反转(IOC)和依赖注入(DI)的设计思想。

目录 1.相关概念 2. 设计IOC容器的两个主要接口 2.1 BeanFactory接口 2.2 ApplicationContext接口 2.3 两个接口的区别【面试题】 3. Bean对象的管理&#xff08;控制反转&#xff09; 3.1 基于XML文件管理bean对象 3.2 基于注解方式去管理【重点】 4. 依赖注入&#…

81.WEB渗透测试-信息收集-框架组件识别利用(5)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;80.WEB渗透测试-信息收集-框架组件识别利用&#xff08;4&#xff09; solr&#xff1a;…

第三方库jsoncpp

文章目录 0.jsoncpp库是做什么的&#xff1f;1.安装库2.有哪几个类&#xff0c;如何使用Json::Value类Json::Writer类-StreamWriterJson::Reader类-CharReader三者关系 3.使用样例将数据先存入Value类&#xff0c;再通过StreamWriter类转为Json格式的字符串获取到Json格式字符串…

6 postgresql事务与并发控制

事务与并发控制 事务可以理解为做一件事&#xff0c;数据库就是一件事要么做完&#xff0c;要么不做&#xff0c;不然这数据库给给人不可靠的感觉 正如解释事务具有四个重要特性&#xff1a;ACID&#xff08;原子性&#xff0c;一致性&#xff0c;隔离性&#xff0c;持久性&a…

python实现提取视频帧的图片

文章目录 1、需求痛点2、完整代码⭐3、代码分析3.1、需要改动的地方3.2、OpenCV库的使用3.3、多线程技术 4、执行效率5、效果展示⭐6、注意事项&#x1f53a;7、总结 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注…

3 IIC总线

3 IIC总线 1、基本概念1.1 IIC总线定义1.2 IIC总线协议概念 2 以AT24C02为例说明时序2.1 基本特性2.2 利用GPIO模拟IIC2.3 对AT24C02的操作2.4 重定向printf 1、基本概念 1.1 IIC总线定义 定义&#xff1a;两线式串行总线 两线式&#xff1a;说明处理器和外设之间只需两根信号…

【时间复杂度和空间复杂度】(内含超多实例练习)

【时间复杂度和空间复杂度】&#xff08;内含超多实例练习&#xff09; 1. 算法效率2. 时间复杂度2.1 时间复杂度的概念2.2 实例练习2.2.1 数组中搜索数据2.2.2 冒泡排序2.2.3 二分查找2.2.4 阶乘递归2.2.5 斐波那契递归 3. 空间复杂度3.1 空间复杂度的概念3.2 实例练习3.2.1 冒…

Set Hashset底层原理 LinkedSet底层原理 Treeset 31

不重复只执行一次&#xff0c;排序是小到大&#xff0c;色图是接口类 Hashset底层原理 LinkedSet底层原理 Treeset 总结

AI+云边端协同,EasyCVR视频汇聚技术赋能安防监控新生态

随着信息技术的飞速发展和数字化时代的到来&#xff0c;安防监控领域的技术也在不断创新和突破。EasyCVR平台的视频汇聚技术作为其中的佼佼者&#xff0c;以其强大的视频处理、汇聚与融合能力&#xff0c;在安防监控领域展现出了巨大的应用潜力和价值。本文将详细介绍EasyCVR视…

权限束缚术:windows工具自动化权限提升

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理利用工具全自动化提权的相关操作方法 因为我没有相关的环境复现&#xff0c;所以没有成功 不过复现的操作就是下面整理的操作 溢出漏洞提权原理 利用溢出漏洞提权&#xff0c;实际上就是一次判断过往的…