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开发实例分享bt种子爬虫程序和种子解析
May 21 Python
Django日志模块logging的配置详解
Feb 14 Python
利用python获取Ping结果示例代码
Jul 06 Python
Python编程实现控制cmd命令行显示颜色的方法示例
Aug 14 Python
Python调用C# Com dll组件实战教程
Oct 12 Python
Python验证文件是否可读写代码分享
Dec 11 Python
python OpenCV学习笔记实现二维直方图
Feb 08 Python
基于python实现简单日历
Jul 28 Python
对Python协程之异步同步的区别详解
Feb 19 Python
python3安装crypto出错及解决方法
Jul 30 Python
Python基于Tkinter编写crc校验工具
May 06 Python
Python调用SMTP服务自动发送Email的实现步骤
Feb 07 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
简单实用的.net DataTable导出Execl
2013/10/28 PHP
laravel 框架配置404等异常页面
2019/01/07 PHP
利用jquery操作select下拉列表框的代码
2010/06/04 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
js中同步与异步处理的方法和区别总结
2013/12/25 Javascript
NodeJS使用jQuery选择器操作DOM
2015/02/13 NodeJs
javascript实现Table排序的方法
2015/05/15 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
jQuery实现的购物车物品数量加减功能代码
2016/11/16 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[06:24]DOTA2亚洲邀请赛小组赛第三日 TOP10精彩集锦
2015/02/01 DOTA
[01:11]steam端dota2实名认证操作流程视频
2021/03/11 DOTA
python 文件操作api(文件操作函数)
2016/08/28 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
快速了解Python开发中的cookie及简单代码示例
2018/01/17 Python
python模拟鼠标点击和键盘输入的操作
2019/08/04 Python
python3中numpy函数tile的用法详解
2019/12/04 Python
Python如何爬取b站热门视频并导入Excel
2020/08/10 Python
python实现简单的tcp 文件下载
2020/09/16 Python
Python 远程开关机的方法
2020/11/18 Python
Html5导航栏吸顶方案原理与对比实现
2020/06/10 HTML / CSS
六查六看剖析材料
2014/02/15 职场文书
技术合作协议书范本
2014/04/18 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
乡镇计划生育工作汇报
2014/10/28 职场文书
政协委员个人总结
2015/03/03 职场文书
作文之亲情600字
2019/09/23 职场文书
python中print格式化输出的问题
2021/04/16 Python
Sql Server之数据类型详解
2022/02/28 SQL Server
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫