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的Django框架中显示对象子集的方法
Jul 21 Python
Python分治法定义与应用实例详解
Jul 28 Python
200 行python 代码实现 2048 游戏
Jan 12 Python
python实现list由于numpy array的转换
Apr 04 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
详解Python数据可视化编程 - 词云生成并保存(jieba+WordCloud)
Mar 26 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
Aug 05 Python
python flask搭建web应用教程
Nov 19 Python
浅析python标准库中的glob
Mar 13 Python
python 弧度与角度互转实例
Apr 15 Python
Python爬虫实现自动登录、签到功能的代码
Aug 20 Python
python 中关于pycharm选择运行环境的问题
Oct 31 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
基于PHP导出Excel的小经验 完美解决乱码问题
2013/06/10 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
php中ltrim()、rtrim()与trim()删除字符空格实例
2014/11/25 PHP
[JS]点出统计器
2020/10/11 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
JS的get和set使用示例
2014/02/20 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
Python with的用法
2014/08/22 Python
python通过wxPython打开一个音频文件并播放的方法
2015/03/25 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
Python3离线安装Requests模块问题
2019/10/13 Python
python操作cfg配置文件方式
2019/12/22 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
分享一枚pycharm激活码适用所有pycharm版本我的pycharm2020.2.3激活成功
2020/11/20 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
Ratchet 模态框的实现
2020/08/19 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
师范生自我鉴定范文
2013/10/05 职场文书
综合测评自我鉴定
2013/10/08 职场文书
《小鹰学飞》教学反思
2014/04/23 职场文书
厕所文明标语
2014/06/11 职场文书
教师演讲稿开场白
2014/08/25 职场文书
2014年公司工作总结
2014/11/22 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
element多个表单校验的实现
2021/05/27 Javascript
Python pygame实现中国象棋单机版源码
2021/06/20 Python
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技