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 26 Python
Python 操作文件的基本方法总结
Aug 10 Python
Python网络编程详解
Oct 31 Python
python 读取txt中每行数据,并且保存到excel中的实例
Apr 29 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
python实现排序算法解析
Sep 08 Python
解决Pycharm界面的子窗口不见了的问题
Jan 17 Python
ipython和python区别详解
Jun 26 Python
Python *args和**kwargs用法实例解析
Mar 02 Python
python else语句在循环中的运用详解
Jul 06 Python
Python Pandas 删除列操作
Mar 16 Python
Python中with上下文管理协议的作用及用法
Mar 18 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
cakephp打印sql语句的方法
2015/02/13 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
用原生JavaScript实现jQuery的$.getJSON的解决方法
2013/05/03 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
一道JS前端闭包面试题解析
2015/12/25 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
详解用函数式编程对JavaScript进行断舍离
2017/09/18 Javascript
vue-cli webpack 引入jquery的方法
2018/01/10 jQuery
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
vue实现文件上传读取及下载功能
2020/11/17 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
Python简单的制作图片验证码实例
2017/05/31 Python
Python编程argparse入门浅析
2018/02/07 Python
TensorFlow实现Logistic回归
2018/09/07 Python
使用python实现简单五子棋游戏
2019/06/18 Python
python的debug实用工具 pdb详解
2019/07/12 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
python 贪心算法的实现
2020/09/18 Python
蛋白质世界:Protein World
2017/11/23 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
公司门卫管理制度
2014/02/01 职场文书
会计工作态度自我评价
2015/03/06 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
spring boot中nativeQuery的用法
2021/07/26 Java/Android