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 模板引擎的注入问题分析
Jan 01 Python
Python实现的视频播放器功能完整示例
Feb 01 Python
Python机器学习之scikit-learn库中KNN算法的封装与使用方法
Dec 14 Python
python opencv将图片转为灰度图的方法示例
Jul 31 Python
redis数据库及与python交互用法简单示例
Nov 01 Python
将pytorch转成longtensor的简单方法
Feb 18 Python
利用python中的matplotlib打印混淆矩阵实例
Jun 16 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
Jan 27 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 Python
python关于集合的知识案例详解
May 30 Python
用Python可视化新冠疫情数据
Jan 18 Python
Python+DeOldify实现老照片上色功能
Jun 21 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
PHP学习之PHP变量
2006/10/09 PHP
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
PHP迭代器的内部执行过程详解
2013/11/12 PHP
php switch语句多个值匹配同一代码块应用示例
2014/07/29 PHP
php构造函数的继承方法
2015/02/09 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
js一般方法改写成面向对象方法的无限级折叠菜单示例代码
2013/07/04 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
JS中图片压缩的方法小结
2017/11/14 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
详解如何在Angular优雅编写HTTP请求
2018/12/05 Javascript
微信小程序如何使用globalData的方法
2019/06/06 Javascript
为什么推荐使用JSX开发Vue3
2020/12/28 Vue.js
Python pickle类库介绍(对象序列化和反序列化)
2014/11/21 Python
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
CSS3中HSL和HSLA的简单使用示例
2015/07/14 HTML / CSS
FragranceNet中文网:北美健康美容线上零售商
2020/08/26 全球购物
模具设计与制造专业应届生求职信
2013/10/18 职场文书
单位工程竣工验收方案
2014/03/16 职场文书
共产党员公开承诺践诺书
2014/05/28 职场文书
志愿者事迹材料
2014/12/26 职场文书
个人工作能力自我评价
2015/03/05 职场文书
写给同事的离职感言
2015/08/04 职场文书
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android