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协程的用法和例子详解
Sep 09 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
python实现员工管理系统
Jan 11 Python
PyCharm代码提示忽略大小写设置方法
Oct 28 Python
python读取图片的方式,以及将图片以三维数组的形式输出方法
Jul 03 Python
关于pycharm中pip版本10.0无法使用的解决办法
Oct 10 Python
Python 将 QQ 好友头像生成祝福语的实现代码
May 03 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
浅谈python数据类型及其操作
May 25 Python
用Python创建简易网站图文教程
Jun 11 Python
Python中的xlrd模块使用整理
Jun 15 Python
Python数据结构之队列详解
Mar 21 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
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
codeigniter数据库操作函数汇总
2014/06/12 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
php中array_unshift()修改数组key注意事项分析
2016/05/16 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
Extjs3.0 checkboxGroup 动态添加item实现思路
2013/08/14 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
2016/02/17 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
2016/12/14 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
Three.js基础学习教程
2017/11/16 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
给localStorage设置一个过期时间的方法分享
2018/11/06 Javascript
利用Bootstrap Multiselect实现下拉框多选功能
2019/04/08 Javascript
react 原生实现头像滚动播放的示例
2020/04/21 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
Python 不同对象比较大小示例探讨
2014/08/21 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
Python流程控制 while循环实现解析
2019/09/02 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
python 多进程队列数据处理详解
2019/12/23 Python
python help函数实例用法
2020/12/06 Python
使用CSS3代码绘制可爱的Hello Kitty猫
2016/08/03 HTML / CSS
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
应用心理学个人的求职信
2013/12/08 职场文书
文明礼仪小标兵事迹
2014/01/12 职场文书
个人作风建设总结
2014/10/23 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
投诉书范文
2015/07/02 职场文书
宪法宣传标语100条
2019/10/15 职场文书