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 相关文章推荐
Cython 三分钟入门教程
Sep 17 Python
python实现读取excel写入mysql的小工具详解
Nov 20 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
python函数的作用域及关键字详解
Aug 20 Python
python实现单目标、多目标、多尺度、自定义特征的KCF跟踪算法(实例代码)
Jan 08 Python
Python视频编辑库MoviePy的使用
Apr 01 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
Jul 01 Python
Python Selenium模块安装使用教程详解
Jul 09 Python
python中pathlib模块的基本用法与总结
Aug 17 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
Selenium环境变量配置(火狐浏览器)及验证实现
Dec 07 Python
TensorFlow的自动求导原理分析
May 26 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 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
2014/06/12 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
php实现的SESSION类
2014/12/02 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
php判断是否连接上网络的方法实例详解
2016/12/14 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
2018/05/12 PHP
php+mysql+ajax 局部刷新点赞/取消点赞功能(每个账号只点赞一次)
2020/07/24 PHP
ext监听事件方法[初级篇]
2008/04/27 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
学习JavaScript设计模式(策略模式)
2015/11/26 Javascript
javascript针对不确定函数的执行方法
2015/12/16 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
vue 动态修改a标签的样式的方法
2018/01/18 Javascript
Vue仿支付宝支付功能
2018/05/25 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
使用原生javascript开发计算器实例代码
2021/02/21 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
Python NumPy库安装使用笔记
2015/05/18 Python
Python UnboundLocalError和NameError错误根源案例解析
2018/10/31 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
一行python实现树形结构的方法
2019/08/09 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
简单了解python关键字global nonlocal区别
2020/09/21 Python
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
运动会闭幕式解说词
2014/02/21 职场文书
《蒲公英》教学反思
2014/02/28 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
教师党员整改措施
2014/10/24 职场文书
股份转让协议书范本
2015/01/27 职场文书
教师考核鉴定意见
2015/06/05 职场文书
win11高清晰音频管理器在哪里?win11找不到高清晰音频管理器解决办法
2022/04/08 数码科技