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实现端口转发器的方法
Mar 13 Python
Python数据库的连接实现方法与注意事项
Feb 27 Python
Python字符串格式化输出方法分析
Apr 13 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
Python实现求笛卡尔乘积的方法
Sep 16 Python
python matplotlib中文显示参数设置解析
Dec 15 Python
python3如何将docx转换成pdf文件
Mar 23 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
Pycharm 安装 idea VIM插件的图文教程详解
Feb 21 Python
python和go语言的区别是什么
Jul 20 Python
python opencv pytesseract 验证码识别的实现
Aug 28 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之第二天
2006/10/09 PHP
php中将一段数据存到一个txt文件中并显示其内容
2014/08/15 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
javascript的trim,ltrim,rtrim自定义函数
2008/09/21 Javascript
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
2014/08/27 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
给Easyui-Datebox设置隐藏或者不可用的解决方法
2017/05/26 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
在Vue中使用highCharts绘制3d饼图的方法
2018/02/08 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
使用layer弹窗,制作编辑User信息页面的方法
2019/09/27 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
python生成器的使用方法
2013/11/21 Python
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
python安装virtualenv虚拟环境步骤图文详解
2019/09/18 Python
Pyorch之numpy与torch之间相互转换方式
2019/12/31 Python
如何基于pythonnet调用halcon脚本
2020/01/20 Python
如何向scrapy中的spider传递参数的几种方法
2020/11/18 Python
python里glob模块知识点总结
2021/01/05 Python
美国杂志订阅折扣与优惠网站:Magazines.com
2016/08/31 全球购物
留学自荐信写作方法
2014/01/27 职场文书
公司节能减排方案
2014/05/16 职场文书
李开复演讲稿
2014/05/24 职场文书
法学院毕业生求职信
2014/06/25 职场文书
教师一帮一活动总结
2014/07/08 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
党支部综合考察意见
2015/06/01 职场文书
MySQL 那些常见的错误设计规范,你都知道吗
2021/07/16 MySQL
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python