技术背景

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

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

npy结构的数据存储

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

  1. [dechin@dechin-manjaro numpy]$ ipython
  2. Python 3.8.5 (default, Sep 4 2020, 07:30:14)
  3. Type 'copyright', 'credits' or 'license' for more information
  4. IPython 7.19.0 -- An enhanced Interactive Python. Type '?' for help.
  5. In [1]: import numpy as np
  6. In [2]: test_arr = np.arange(10)
  7. In [3]: np.save('test_arr', test_arr)
  8. In [5]: !ls -l
  9. 总用量 4
  10. -rw-r--r-- 1 dechin dechin 208 5 2 18:52 test_arr.npy

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

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

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

  1. In [7]: test_arr = np.random.randn(2,5)
  2. In [8]: np.save('random_arr', test_arr)
  3. In [9]: !ls -l
  4. 总用量 8
  5. -rw-r--r-- 1 dechin dechin 208 5 2 18:56 random_arr.npy
  6. -rw-r--r-- 1 dechin dechin 208 5 2 18:52 test_arr.npy
  7. In [10]: print (np.load('random_arr.npy'))
  8. [[ 2.6917403 0.01488535 -0.5259401 -1.41512577 0.65968369]
  9. [-0.68929493 0.30153131 0.84906878 -2.20849715 0.34260589]]

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

  1. In [11]: normal_arr = [1,3,5,7,9]
  2. In [12]: np.save('normal_arr', normal_arr)
  3. In [13]: print (np.load('normal_arr.npy'))
  4. [1 3 5 7 9]

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

  1. In [14]: tuple_arr = [(1,2),(2,3),(3,4)]
  2. In [15]: np.save('tuple_arr', tuple_arr)
  3. In [16]: print (np.load('tuple_arr.npy'))
  4. [[1 2]
  5. [2 3]
  6. [3 4]]

npz结构的数据存储

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

  1. In [17]: multi_arr1 = 3
  2. In [18]: multi_arr2 = [1,2,3]
  3. In [19]: multi_arr3 = (4,5)
  4. In [20]: multi_arr4 = [[6,7],[8,9]]
  5. In [22]: np.savez('multi_arr',multi_arr1,multi_arr2,multi_arr3,named_arr=multi_arr4)
  6. In [23]: !ls -l
  7. 总用量 20
  8. -rw-r--r-- 1 dechin dechin 1078 5 2 19:09 multi_arr.npz
  9. -rw-r--r-- 1 dechin dechin 168 5 2 19:00 normal_arr.npy
  10. -rw-r--r-- 1 dechin dechin 208 5 2 18:56 random_arr.npy
  11. -rw-r--r-- 1 dechin dechin 208 5 2 18:52 test_arr.npy
  12. -rw-r--r-- 1 dechin dechin 176 5 2 19:02 tuple_arr.npy
  13. In [24]: data=np.load('multi_arr.npz')
  14. In [25]: data['arr_0']
  15. Out[25]: array(3)
  16. In [26]: data['arr_1']
  17. Out[26]: array([1, 2, 3])
  18. In [27]: data['arr_2']
  19. Out[27]: array([4, 5])
  20. In [28]: data['named_arr']
  21. Out[28]:
  22. array([[6, 7],
  23. [8, 9]])

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

存储数据的压缩

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

  1. [dechin@dechin-manjaro numpy]$ ll
  2. 总用量 20
  3. -rw-r--r-- 1 dechin dechin 1078 5 2 19:09 multi_arr.npz
  4. -rw-r--r-- 1 dechin dechin 168 5 2 19:00 normal_arr.npy
  5. -rw-r--r-- 1 dechin dechin 208 5 2 18:56 random_arr.npy
  6. -rw-r--r-- 1 dechin dechin 208 5 2 18:52 test_arr.npy
  7. -rw-r--r-- 1 dechin dechin 176 5 2 19:02 tuple_arr.npy
  8. [dechin@dechin-manjaro numpy]$ tar -zcvf multi_arr.tar.gz multi_arr.npz
  9. multi_arr.npz
  10. [dechin@dechin-manjaro numpy]$ ll
  11. 总用量 24
  12. -rw-r--r-- 1 dechin dechin 1078 5 2 19:09 multi_arr.npz
  13. -rw-r--r-- 1 dechin dechin 427 5 2 19:14 multi_arr.tar.gz
  14. -rw-r--r-- 1 dechin dechin 168 5 2 19:00 normal_arr.npy
  15. -rw-r--r-- 1 dechin dechin 208 5 2 18:56 random_arr.npy
  16. -rw-r--r-- 1 dechin dechin 208 5 2 18:52 test_arr.npy
  17. -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/numba.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

python3存储numpy格式的矩阵的更多相关文章

  1. 其它课程中的python---3、numpy总结(非常全)

    其它课程中的python---3.numpy总结(非常全) 一.总结 一句话总结: 学习方式应该是:听课+总结:-->找总结博客+再总结 需要始终记住:凭借,继承,复用 1.numpy的主要功能 ...

  2. Python3:numpy模块中的argsort()函数

    Python3:numpy模块中的argsort()函数   argsort函数是Numpy模块中的函数: >>> import numpy >>> help(nu ...

  3. laravel 存储base64格式图片

    laravel 存储base64格式图片 一.总结 一句话总结: 用正则替换base64图片编码的编码头即可 存储图片的话,用laravel可以用Storage的put方法,原生php可以用file_ ...

  4. python上数据存储 .h5格式或者h5py

    最近在做城市计算的项目,数据文件是以.h5的格式存储的,总结下其用法和特点 来自百度百科的简介: HDF(Hierarchical Data Format),可以存储不同类型的图像和数码数据的文件格式 ...

  5. python numpy 使用笔记 矩阵操作

    (原创文章转载请标注来源) 在学习机器学习的过程中经常会用到矩阵,那么使用numpy扩展包将是不二的选择 建议在平Python中用多维数组(array)代替矩阵(matrix) 入门请考 http:/ ...

  6. Jupyter中python3之numpy练习

    ---恢复内容开始--- Numpy_pratice In [2]: n = 10 L = [i for i in range(n)] In [3]: L * 2 Out[3]: [0, 1, 2, ...

  7. python3中numpy函数tile的用法

    tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...

  8. 利用python将二值csv格式转换为矩阵

    #!/usr/bin/env python # coding:utf-8 #import pandas as pd, numpy as np; ''' 将csv文件转换为对应的邻接矩阵mat ''' ...

  9. Python3.5 numpy,scipy,安装

    不是特别难,先保证环境变量正确配置 首先,安装了VS2015; 第二,在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下: 第三,下载相对应的 ...

随机推荐

  1. hive分区分桶

    目录 1.分区 1.1.静态分区 1.1.1.一个分区 1.1.2.多个分区 1.2.动态分区 2.分桶 1.分区 如果一个表中数据很多,我们查询时就很慢,耗费大量时间,如果要查询其中部分数据该怎么办 ...

  2. Python 过滤字母和数字

    [前言]在写爬虫时,正则表达式有时候比较难写,一个是自己不熟练,二者数据分析提取数据千奇百怪. 一.好在python有个re模块,提供了很多更加简便的方法:可参考此文档:https://www.cnb ...

  3. (三)MySQL锁机制 + 事务

    转: (三)MySQL锁机制 + 事务 表锁(偏读) 偏向MyISAM存储引擎.开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发最低. 查看当前数据库中表的上锁情况,0表示未上锁. sh ...

  4. 【产品设计】linux产品设计总结笔记

    Linux 预研产品设计   产品的目的: 1.综合集团内部重复性开发的工作,将多种操作系统统一到科东统一负责 2.明确技术在哪些设备上是可行的,再去拓展.一开始不做平台化产品 3.软件规划需要结合硬 ...

  5. add_header被覆盖 -配置错误

    Nginx的配置文件分为Server.Location.If等一些配置块,并且存在包含关系,和编程语言比较类似.如果在外层配置的一些选项,是可以被继承到内层的. 但这里的继承也有一些特性,比如add_ ...

  6. Excel查分系统搭建小技巧

    推荐一个教师必备工具"Yichafen",是一个在线查分系统,全国8000所高校都在用,三分钟极速创建发布查分系统 在工作学习中,我们经常会遇到查分系统这样的问题.培根说过:读书足 ...

  7. 【翻译】内部API的价值

    内部api的设计,主要是为了简化软件的开发,简化系统和操作过程.目前绝大多数用例是这样的. 内部api经常被忽略,因为它们是针对内部开发人员的.这种类型的api通常使用于特定公司及其部门的专用数据.尽 ...

  8. Hi3559AV100 NNIE开发(5)mobilefacenet.wk仿真成功量化及与CNN_convert_bin_and_print_featuremap.py输出中间层数据对比过程

    前面随笔给出了NNIE开发的基本知识,下面几篇随笔将着重于Mobilefacenet NNIE开发,实现mobilefacenet.wk的chip版本,并在Hi3559AV100上实现mobilefa ...

  9. java中==和equals()方法

    java 程序中测试两个变量是否相等有两种方法: == equals()方法 当使用==判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量 ...

  10. N皇后求解。万万没想到,只用一个一维数组就搞定了。还体现了回溯。

    一.啥是N皇后?先从四皇后入手 给定一个4x4的棋盘,要在棋盘上放置4个皇后.他们的位置有这样的要求,每一列,每一行,每一对角线都能有一个皇后. 你可能会对这个对角线有疑惑,其实就是每一个小正方形的对 ...