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, 2, 3])
In [27]: data['arr_2']
Out[27]: array([4, 5])
In [28]: data['named_arr']
Out[28]:
array([[6, 7],
[8, 9]])
在npz
的数据结构中,除了列表以外的格式都会被自动转化成numpy的列表。而多个的列表对象最终是以字典的形式存储在文件中,如果不加以定义,那么索引的名称默认为arr_
加上一个数字的格式,以0
为起点。如果需要手动的命名,需要在传入savez
函数的末尾处加上手动命名的对象,比如上面实例中的named_arr
。npz
文件的读取方式跟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/numba.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/
python3存储numpy格式的矩阵的更多相关文章
- 其它课程中的python---3、numpy总结(非常全)
其它课程中的python---3.numpy总结(非常全) 一.总结 一句话总结: 学习方式应该是:听课+总结:-->找总结博客+再总结 需要始终记住:凭借,继承,复用 1.numpy的主要功能 ...
- Python3:numpy模块中的argsort()函数
Python3:numpy模块中的argsort()函数 argsort函数是Numpy模块中的函数: >>> import numpy >>> help(nu ...
- laravel 存储base64格式图片
laravel 存储base64格式图片 一.总结 一句话总结: 用正则替换base64图片编码的编码头即可 存储图片的话,用laravel可以用Storage的put方法,原生php可以用file_ ...
- python上数据存储 .h5格式或者h5py
最近在做城市计算的项目,数据文件是以.h5的格式存储的,总结下其用法和特点 来自百度百科的简介: HDF(Hierarchical Data Format),可以存储不同类型的图像和数码数据的文件格式 ...
- python numpy 使用笔记 矩阵操作
(原创文章转载请标注来源) 在学习机器学习的过程中经常会用到矩阵,那么使用numpy扩展包将是不二的选择 建议在平Python中用多维数组(array)代替矩阵(matrix) 入门请考 http:/ ...
- 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, ...
- python3中numpy函数tile的用法
tile函数位于python模块 numpy.lib.shape_base中,他的功能是重复某个数组.比如tile(A,n),功能是将数组A重复n次,构成一个新的数组,我们还是使用具体的例子来说明问题 ...
- 利用python将二值csv格式转换为矩阵
#!/usr/bin/env python # coding:utf-8 #import pandas as pd, numpy as np; ''' 将csv文件转换为对应的邻接矩阵mat ''' ...
- Python3.5 numpy,scipy,安装
不是特别难,先保证环境变量正确配置 首先,安装了VS2015; 第二,在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下: 第三,下载相对应的 ...
随机推荐
- Java基础语法:包机制
为了更好地组织类,Java 提供了包(package)机制. 这种机制是为了防止命名冲突,访问控制,提供搜索和定位类(class).接口(interface).枚举(enumerations)和注释( ...
- DRF简介/接口概念
目录 一.drf框架简介 1. drf安装 2. drf的优势 二.接口 1. 接口的概念 2. 接口文档 3. 接口规范(restful) 3.1 url链接规范 3.2 请求方式规范 3.3 响应 ...
- 手把手教你手写一个最简单的 Spring Boot Starter
欢迎关注微信公众号:「Java之言」技术文章持续更新,请持续关注...... 第一时间学习最新技术文章 领取最新技术学习资料视频 最新互联网资讯和面试经验 何为 Starter ? 想必大家都使用过 ...
- crudapi零代码开发平台应用场景和成功案例
应用场景 在前面文章中,已经介绍了crudapi主要功能和使用方式,本文主要介绍crudapi应用场景以及具体的使用方式. 概要 crudapi属于产品级的零代码平台,无需编程,通过配置自动生成cru ...
- sanic-jwt 的使用
Sanic 是基于 Python 的一个支持高并发的异步 web 框架,sanic-jwt 则是针对Sanic 开发的一个基于 PyJWT 封装的 JWT 授权认证模块. sanic-jwt 项目主页 ...
- 前后端分离之DRF——1
1. 作用 1. 序列化,序列化器会把模型对象转成字典,经过 response 以后变成 json 字符串 2. 反序列化,把客户端发送过来的数据,经过 request 以后变成字典,序列化器可以把字 ...
- zxy的猪错误
我觉得这篇文章还是要重构啊,如果哪道题调的久了就标上日期放上来吧. 2021/3/10 题目:玩游戏 \(\tt memset\) 不能直接清空一个指针指向的数组,因为不知道 \(\tt size\) ...
- 正则表达式-Python实现
1.概述: Regular Expression.缩写regex,regexp,R等: 正则表达式是文本处理极为重要的工具.用它可以对字符串按照某种规则进行检索,替换. Shell编程和高级编程语言中 ...
- 怎么理解onStart可见但不可交互
前言 今天朋友遇到一个面试题,分享给大家: onStart生命周期表示Activity可见,那为什么不能交互呢? 这个问题看似简单,但涉及到的面还是比较多的,比如Activity生命周期的理解,进程的 ...
- 攻防世界 reverse Mysterious
Mysterious BUUCTF-2019 int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4) { char v5; // [e ...