python3存储numpy格式的矩阵

编程之家收集整理的这篇文章主要介绍了python3存储numpy格式的矩阵编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

技术背景

numpy在python中的地位是相当高的,即使是入门的python使用者也会经常看到这个库的使用。除了替代python自带的列表数据格式list之外,numpy的一大优势是其底层的高性能实现方式,比如前一篇博客中所提到的矢量运算,就是一种基于SIMD的底层运算优化方案,使得numpy的计算速度远高于一个普通的for循环。

而在日常运算的过程中,有些数据往往是不会变化的,比如机器学习中的测试和训练数据。那么如果这里使用的是numpy的数据结构的话,就会涉及到相关数据的存储,numpy可以将其数据存储为.npy或者.npz结构。

npy结构的数据存储

npy格式适用于单个numpy列表的存储,这个列表的维度可以是任意的,但是最外层必须是一个numpy的列表结构。以下用ipython来展示npy文件的基本使用方法,首先是创建一个数组,然后用np.save保存到一个给定的文件名中:

[dechin@dechin-manjaro numpy]$ ipython
Python 3.8.5 (default,Sep  4 2020,07:30:14) 
Type 'copyright','credits' or 'license' for more information
IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import numpy as np

In [2]: test_arr = np.arange(10)

In [3]: np.save('test_arr',test_arr)

In [5]: !ls -l
总用量 4
-rw-r--r-- 1 dechin dechin 208  5月  2 18:52 test_arr.npy

可以看到文件名会自动补充npy的后缀,然后可以在当前目录下使用np.load函数直接加载刚才保存的数据:

In [6]: print (np.load('test_arr.npy'))
[0 1 2 3 4 5 6 7 8 9]

类似的可以测试一下多个维度的随机数组:

In [7]: test_arr = np.random.randn(2,5)

In [8]: np.save('random_arr',test_arr)

In [9]: !ls -l
总用量 8
-rw-r--r-- 1 dechin dechin 208  5月  2 18:56 random_arr.npy
-rw-r--r-- 1 dechin dechin 208  5月  2 18:52 test_arr.npy

In [10]: print (np.load('random_arr.npy'))
[[ 2.6917403   0.01488535 -0.5259401  -1.41512577  0.65968369]
 [-0.68929493  0.30153131  0.84906878 -2.20849715  0.34260589]]

除了可以保存numpy格式的数组,还可以直接保存python本身的数组格式的数据:

In [11]: normal_arr = [1,3,5,7,9]

In [12]: np.save('normal_arr',normal_arr)

In [13]: print (np.load('normal_arr.npy'))
[1 3 5 7 9]

甚至还可以保存一些非列表格式的数据,比如python中的tuple,但是保存后重新加载的数据格式,会被自动转化成列表格式:

In [14]: tuple_arr = [(1,2),(2,3),(3,4)]

In [15]: np.save('tuple_arr',tuple_arr)

In [16]: print (np.load('tuple_arr.npy'))
[[1 2]
 [2 3]
 [3 4]]

npz结构的数据存储

上面介绍的npy数据结构存储下来是一个二进制的文件,仅用于单个列表数据结构的存储,这里的npz数据结构可以存储多个列表结构的对象,可以直接参考一个使用案例:

In [17]: multi_arr1 = 3

In [18]: multi_arr2 = [1,2,3]

In [19]: multi_arr3 = (4,5)

In [20]: multi_arr4 = [[6,7],[8,9]]

In [22]: np.savez('multi_arr',multi_arr1,multi_arr2,multi_arr3,named_arr=multi_arr4)

In [23]: !ls -l
总用量 20
-rw-r--r-- 1 dechin dechin 1078  5月  2 19:09 multi_arr.npz
-rw-r--r-- 1 dechin dechin  168  5月  2 19:00 normal_arr.npy
-rw-r--r-- 1 dechin dechin  208  5月  2 18:56 random_arr.npy
-rw-r--r-- 1 dechin dechin  208  5月  2 18:52 test_arr.npy
-rw-r--r-- 1 dechin dechin  176  5月  2 19:02 tuple_arr.npy

In [24]: data=np.load('multi_arr.npz')

In [25]: data['arr_0']
Out[25]: array(3)

In [26]: data['arr_1']
Out[26]: array([1,3])

In [27]: data['arr_2']
Out[27]: array([4,5])

In [28]: data['named_arr']
Out[28]: 
array([[6,9]])

npz的数据结构中,除了列表以外的格式都会被自动转化成numpy的列表。而多个的列表对象最终是以字典的形式存储在文件中,如果不加以定义,那么索引的名称默认为arr_加上一个数字的格式,以0为起点。如果需要手动的命名,需要在传入savez函数的末尾处加上手动命名的对象,比如上面实例中的named_arrnpz文件的读取方式跟npy是一样的,使用np.load函数即可。

存储数据的压缩

最后我们再额外介绍一个tar压缩包的使用方法,如果存储的npz文件较大,可以通过tar -zcvf filename.tar.gz filename.npz打包成一个压缩包,特别是当数据中0数量较多时,可以获得一个非常理想的压缩比。

[dechin@dechin-manjaro numpy]$ ll
总用量 20
-rw-r--r-- 1 dechin dechin 1078  5月  2 19:09 multi_arr.npz
-rw-r--r-- 1 dechin dechin  168  5月  2 19:00 normal_arr.npy
-rw-r--r-- 1 dechin dechin  208  5月  2 18:56 random_arr.npy
-rw-r--r-- 1 dechin dechin  208  5月  2 18:52 test_arr.npy
-rw-r--r-- 1 dechin dechin  176  5月  2 19:02 tuple_arr.npy
[dechin@dechin-manjaro numpy]$ tar -zcvf multi_arr.tar.gz multi_arr.npz 
multi_arr.npz
[dechin@dechin-manjaro numpy]$ ll
总用量 24
-rw-r--r-- 1 dechin dechin 1078  5月  2 19:09 multi_arr.npz
-rw-r--r-- 1 dechin dechin  427  5月  2 19:14 multi_arr.tar.gz
-rw-r--r-- 1 dechin dechin  168  5月  2 19:00 normal_arr.npy
-rw-r--r-- 1 dechin dechin  208  5月  2 18:56 random_arr.npy
-rw-r--r-- 1 dechin dechin  208  5月  2 18:52 test_arr.npy
-rw-r--r-- 1 dechin dechin  176  5月  2 19:02 tuple_arr.npy

而关于tar.gz格式的文件的解压缩,则是使用tar -xvf filename.tar.gz命令。

总结概要

在科学计算中对于恒定不变的数据,不一定需要实时保存在内存中,或者是需要跨平台运算的数据,我们可以将其保存为numpy格式的列表文件npy或者npz。而如果存储的文件过大,本文也额外介绍了简单的tar压缩与解压缩的使用方法

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/npz.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/

总结

以上是编程之家为你收集整理的python3存储numpy格式的矩阵全部内容,希望文章能够帮你解决python3存储numpy格式的矩阵所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

相关文章

猜你在找的Python相关文章

一个完善的python项目,不仅需要梳理好核心代码的软件架构,还需要定义好依赖文件、编译构建文件、API接口文档、编码规范门禁等。这里我们介绍了如何用setup.py文件来完善一个最简单的python
通过python可以调用smtp第三方邮件服务接口,这使得我们可以通过python直接来发送邮件。在这个功能基础上,我们可以结合Linux的定时任务服务Crontab,来开发一些有意思的项目,比如爬虫
通过pyinstaller我们可以将一个python项目打包编译构建成一个可执行文件,然后将该可执行文件放置到一个系统路径下,使得系统可以不需要路径也能够识别到这个可执行文件,这样我们就可以仅配置一些
本文介绍了如何使用os.access的方法来判断系统文件的存在性与读、写和可执行权限等。这在日常文件操作中有着比较重要的意义,意味着我们可以先判断文件是否存在再决定是否删除系统文件,而不是直接用os.
本文中通过python库diagrams展示了基础的架构图绘制的方法,库中提供了常用的AWS和k8S等场景下常用的组件标签,使得我们用python代码也可以绘制精美清晰的架构图。这里组件之间的连接和耦
本文介绍了两种表格数据的打印工具:tabulate和prettytable的安装与基本使用方法。由于表格数据本身是没有对输出格式进行规范化的,因此打印出来的数据会显得比较杂乱,不利于直观的阅读。因此引
多进程技术是独立于算法任务本身的一种优化技术,通过python中的concurrent库,我们可以非常容易的实现多进程的任务,用来优化已有的算法。这里我们也给出了一些多进程配置信息的参考方案,在GPU
告警和异常信息的定义与处理,在网络编程项目和各种实际计算的场景中都会被用到。这里我们通过两篇博客进行了比较简单的介绍,对于没有特殊要求的用户而言,按照示例中给出的样板直接修改就能够使用。更多的时候是规