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标准异常和异常处理详解
Feb 02 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
python3中set(集合)的语法总结分享
Mar 24 Python
python逐行读写txt文件的实例讲解
Apr 03 Python
python 读取DICOM头文件的实例
May 07 Python
Windows下安装Scrapy
Oct 17 Python
Python中类的创建和实例化操作示例
Feb 27 Python
python networkx 根据图的权重画图实现
Jul 10 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
Python threading.local代码实例及原理解析
Mar 16 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 foreach、while性能比较
2009/10/15 PHP
php实现将字符串按照指定距离进行分割的方法
2015/03/14 PHP
详解php中反射的应用
2016/03/15 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
玩转方法:call和apply
2014/05/08 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
简述AngularJS的控制器的使用
2015/06/16 Javascript
Javascript中匿名函数的调用与写法实例详解(多种)
2016/01/26 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
jQuery取得元素标签名称小结(附代码)
2017/08/16 jQuery
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
jquery.picsign图片标注组件实例详解
2018/02/02 jQuery
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
python选择排序算法的实现代码
2013/11/21 Python
在Python的Flask框架下收发电子邮件的教程
2015/04/21 Python
python将字符串以utf-8格式保存在txt文件中的方法
2018/10/30 Python
python打包生成的exe文件运行时提示缺少模块的解决方法
2018/10/31 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
Django实现文章详情页面跳转代码实例
2020/09/16 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
python中实现栈的三种方法
2020/12/19 Python
HTML5 Canvas实现360度全景图的示例代码
2018/01/29 HTML / CSS
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
毕业生个人求职信范文分享
2014/01/05 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
2014房屋登记授权委托书
2014/10/13 职场文书
学生打架检讨书
2014/10/20 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
详解CSS中postion和opacity及cursor的特性
2022/08/14 HTML / CSS