numpy数组之存取文件的实现示例


Posted in Python onMay 24, 2019

将 numpy 数组存入文件,有多种文件类型可供选择,对应地就有不同的方法来读写。

下面我将介绍读写 numpy 的三类文件:

  • txt 或者 csv 文件
  • npy 或者 npz 文件
  • hdf5 文件

通过 numpy 读写 txt 或 csv 文件

import numpy as np

a = np.array(range(20)).reshape((4, 5))
print(a)

# 后缀改为 .txt 一样
filename = 'data/a.csv'
# 写文件
np.savetxt(filename, a, fmt='%d', delimiter=',')

# 读文件
b = np.loadtxt(filename, dtype=np.int32, delimiter=',')
print(b)

缺点:

  • 只能保存一维和二维 numpy 数组,当 numpy 数组 a 有多维时,需要将其 a.reshape((a.shape[0], -1)) 后才能用这种方式保存。
  • 不能追加保存,即每次 np.savetxt() 都会覆盖之前的内容。

通过 numpy 读写 npy 或 npz 文件

读写 npy 文件

import numpy as np

a = np.array(range(20)).reshape((2, 2, 5))
print(a)

filename = 'data/a.npy'
# 写文件
np.save(filename, a)

# 读文件
b = np.load(filename)
print(b)
print(b.shape)

优点:

  • npy 文件可以保存任意维度的 numpy 数组,不限于一维和二维;
  • npy 保存了 numpy 数组的结构,保存的时候是什么 shape 和 dtype,取出来时就是什么样的 shape 和 dtype。

缺点:

  • 只能保存一个 numpy 数组,每次保存会覆盖掉之前文件中存在的内容(如果有的话)。

读写 npz 文件

import numpy as np

a = np.array(range(20)).reshape((2, 2, 5))
b = np.array(range(20, 44)).reshape(2, 3 ,4)
print('a:\n', a)
print('b:\n', b)

filename = 'data/a.npz'
# 写文件, 如果不指定key,那么默认key为'arr_0'、'arr_1',一直排下去。
np.savez(filename, a, b=b)

# 读文件
c = np.load(filename)
print('keys of NpzFile c:\n', c.keys())
print("c['arr_0']:\n", c['arr_0'])
print("c['b']:\n", c['b'])

优点:

  • npy 文件可以保存任意维度的 numpy 数组,不限于一维和二维;
  • npy 保存了 numpy 数组的结构,保存的时候是什么 shape 和 dtype,取出来时就是什么样的 shape 和 dtype;
  • 可以同时保存多个 numpy 数组;
  • 可以指定保存 numpy 数组的 key,读取的时候很方便,不会混乱。

缺点:

  • 保存多个 numpy 数组时,只能同时保存,即 np.savez(filename, a, b=b) 。每次保存会覆盖掉之前文件中存在的内容(如果有的话)。

通过 h5py 读写 hdf5 文件

优点:

  • 不限 numpy 数组维度,可以保持 numpy 数组结构和数据类型;
  • 适合 numpy 数组很大的情况,文件占用空间小;
  • 可以通过 key 来访问 dataset(可以理解为 numpy.array),读取的时候很方便,不会混乱。
  • 可以不覆盖原文件中含有的内容。

简单读取

import numpy as np
import h5py

a = np.array(range(20)).reshape((2, 2, 5))
b = np.array(range(20)).reshape((1, 4, 5))
print(a)
print(b)

filename = 'data/data.h5'
# 写文件
h5f = h5py.File(filename, 'w')
h5f.create_dataset('a', data=a)
h5f.create_dataset('b', data=b)
h5f.close()

# 读文件
h5f = h5py.File(filename, 'r')
print(type(h5f))
# 通过切片得到numpy数组
print(h5f['a'][:])
print(h5f['b'][:])
h5f.close()

通过切片赋值

import numpy as np
import h5py

a = np.array(range(20)).reshape((2, 2, 5))
print(a)

filename = 'data/a.h5'
# 写文件
h5f = h5py.File(filename, 'w')
# 当数组a太大,需要切片进行操作时,可以不直接对h5f['a']进行初始化;
# 当之后不需要改变h5f['a']的shape时,可以省略maxshape参数
h5f.create_dataset('a', shape=(2, 2, 5), maxshape=(None, 2, 5), dtype=np.int32, compression='gzip')
for i in range(2):
  # 采用切片的形式赋值
  h5f['a'][i] = a[i]
h5f.close()

# 读文件
h5f = h5py.File(filename, 'r')
print(type(h5f))
print(h5f['a'])
# 通过切片得到numpy数组
print(h5f['a'][:])

同一个 hdf5 文件可以创建多个 dataset,读取的时候按照 key 来即可。

总结

  • csv 和 txt 只能用来存一维或二维 numpy 数组;
  • npy 用来存单个 numpy 数组,npz 可以同时存多个 numpy 数组,两者都不限 numpy 维度,且都保持 numpy 数组的 shape 和 dtype,写文件时若原文件存在只能覆盖原文件内容;
  • 当 numpy 数组很大时,最好使用 hdf5 文件,hdf5 文件相对更小;
  • 当 numpy 数组很大时,对整个 numpy 数组进行运算容易发生 MemoryError,那么此时可以选择对 numpy 数组切片,将运算后的数组保存到 hdf5 文件中,hdf5 文件支持切片索引。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python算法学习之桶排序算法实例(分块排序)
Dec 18 Python
python中as用法实例分析
Apr 30 Python
《与孩子一起学编程》python自测题
May 27 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
python使用rpc框架gRPC的方法
Aug 24 Python
python使用Matplotlib绘制分段函数
Sep 25 Python
Python列表对象实现原理详解
Jul 01 Python
python 实现线程之间的通信示例
Feb 14 Python
浅谈matplotlib中FigureCanvasXAgg的用法
Jun 16 Python
python的json包位置及用法总结
Jun 21 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
Feb 22 Python
Python实现使用request模块下载图片demo示例
May 24 #Python
Python实现操纵控制windows注册表的方法分析
May 24 #Python
Django框架会话技术实例分析【Cookie与Session】
May 24 #Python
Django框架中间件(Middleware)用法实例分析
May 24 #Python
python与字符编码问题
May 24 #Python
Python读取stdin方法实例
May 24 #Python
python实践项目之监控当前联网状态详情
May 23 #Python
You might like
JAVA/JSP学习系列之四
2006/10/09 PHP
PHP获取youku视频真实flv文件地址的方法
2014/12/23 PHP
详解php中 === 的使用
2016/10/24 PHP
PHP实现简单的模板引擎功能示例
2017/09/02 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
2019/10/11 PHP
javascript删除字符串最后一个字符
2014/01/14 Javascript
JavaScript实现彩虹文字效果的方法
2015/04/16 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
JavaScript根据CSS的Media Queries来判断浏览设备的方法
2016/05/10 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
vue组件如何被其他项目引用
2017/04/13 Javascript
Vue.js使用$.ajax和vue-resource实现OAuth的注册、登录、注销和API调用
2017/05/10 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
基于Vue的ajax公共方法(详解)
2018/01/20 Javascript
vue实现商品加减计算总价的实例代码
2018/08/12 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
Vue使用预渲染代替SSR的方法
2020/07/02 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
Python脚本在Appium库上对移动应用实现自动化测试
2015/04/17 Python
Python中的ctime()方法使用教程
2015/05/22 Python
python3之模块psutil系统性能信息使用
2018/05/30 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Python实现的对本地host127.0.0.1主机进行扫描端口功能示例
2019/02/15 Python
python3调用windows dos命令的例子
2019/08/14 Python
Pytorch中膨胀卷积的用法详解
2020/01/07 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
CSS3解析抖音LOGO制作的方法步骤
2019/04/11 HTML / CSS
全球最大的服务市场:Fiverr
2017/01/03 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
环境卫生标语
2014/06/09 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
用Python爬取某乎手机APP数据
2021/06/15 Python
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers