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中动态获取对象的属性和方法的教程
Apr 09 Python
Python 实现交换矩阵的行示例
Jun 26 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
解决json中ensure_ascii=False的问题
Apr 03 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
Python闭包与装饰器原理及实例解析
Apr 30 Python
sklearn线性逻辑回归和非线性逻辑回归的实现
Jun 09 Python
PyQt5的相对布局管理的实现
Aug 07 Python
Python基础之元类详解
Apr 29 Python
浅析Python实现DFA算法
Jun 26 Python
Python的property属性详细讲解
Apr 11 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 替换模板变量实现步骤
2009/08/24 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
php jsonp单引号转义
2014/11/23 PHP
php操作xml入门之xml标签的属性分析
2015/01/23 PHP
在Windows XP下安装Apache+MySQL+PHP环境
2015/02/22 PHP
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
使用jQuery重置(reset)表单的方法
2014/05/05 Javascript
jQuery实现菜单感应鼠标滑动动画效果的方法
2015/02/28 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
原生js实现tab选项卡切换
2020/03/23 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
React中使用collections时key的重要性详解
2017/08/07 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
讲解python参数和作用域的使用
2013/11/01 Python
使用Flask-Cache缓存实现给Flask提速的方法详解
2019/06/11 Python
python编写微信公众号首图思路详解
2019/12/13 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
Python中包的用法及安装
2020/02/11 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
收藏!10个免费高清视频素材网站!【设计、视频剪辑必备】
2021/03/18 杂记
印度低票价航空公司:GoAir
2017/10/11 全球购物
指针和引用有什么区别
2013/01/13 面试题
SQL面试题
2013/04/30 面试题
促销活动策划方案
2014/01/12 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
党员专题组织生活会发言材料
2014/10/17 职场文书
干部年终考核评语
2015/01/04 职场文书
学生个人总结范文
2015/02/15 职场文书
法学专业求职信范文
2015/03/19 职场文书
中小企业员工手册范本
2015/05/14 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
失恋33天观后感
2015/06/11 职场文书
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL