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中的列表推导浅析
Apr 26 Python
跟老齐学Python之变量和参数
Oct 10 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
Apr 28 Python
python通过加号运算符操作列表的方法
Jul 28 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
python调用API实现智能回复机器人
Apr 10 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
基于python历史天气采集的分析
Feb 14 Python
Python中如何导入类示例详解
Apr 17 Python
Python 格式化输出_String Formatting_控制小数点位数的实例详解
Feb 04 Python
Python实现自动签到脚本的示例代码
Aug 19 Python
Python urllib库如何添加headers过程解析
Oct 05 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实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
JavaScript 组件之旅(三):用 Ant 构建组件
2009/10/28 Javascript
jQuery控制图片的hover效果(smartRollover.js)
2012/03/18 Javascript
jQuery 图片切换插件(代码比较少)
2012/05/07 Javascript
jQuery插件实现表格隔行换色且感应鼠标高亮行变色
2013/09/22 Javascript
快速学习jQuery插件 Cookie插件使用方法
2015/12/01 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
nodejs爬虫遇到的乱码问题汇总
2017/04/07 NodeJs
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
Python守护进程(daemon)代码实例
2015/03/06 Python
Django中URLconf和include()的协同工作方法
2015/07/20 Python
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
Python中模块pymysql查询结果后如何获取字段列表
2017/06/05 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
Python接口自动化测试的实现
2020/08/28 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
python通用数据库操作工具 pydbclib的使用简介
2020/12/21 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
连锁经营管理专业大学生求职信
2013/10/30 职场文书
会计电算化专业个人的自我评价
2013/11/24 职场文书
幼儿教师培训感言
2014/03/08 职场文书
2014年督导工作总结
2014/11/19 职场文书
运动会5000米加油稿
2015/07/21 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
复制别人的成功真的会成功吗?
2019/10/17 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python