输入和输出numpy数组到h5py


100

我有一个Python代码,其输出为在此处输入图片说明大小矩阵,其条目均为type float。如果使用扩展名保存,.dat则文件大小约为500 MB。我读到使用h5py会大大减少文件大小。因此,假设我有一个名为的2D numpy数组A。如何将其保存到h5py文件?另外,由于需要对数组进行操作,如何读取相同文件并将其作为numpy数组放入不同的代码中?


4
如何使用.dat扩展名保存它?
jorgeca 2014年

@jorgeca:我只是这么做np.savetxt("output.dat",A,'%10.8e')
lovespeed 2014年

3
谢谢(扩展本身并没有多大意义,可以将其存储为二进制,ascii ...)。除非您需要hdf5的其他功能,否则我将只使用np.save('output.dat', A)它将以二进制格式保存它(更快,所用空间更少)。
jorgeca 2014年

@jorgeca,但是当我将其称为A = np.loadtxt('output.dat',unpack=True)
lovespeed 2014年

2
所以h5py创建的文件不会比那些小np.save吗?是h5py速度比np.save在问题中给出的大小的数组?
dbliss 2015年

Answers:


131

h5py提供了一个数据集模型。前者基本上是数组,而后者可以视为目录。每个都被命名。您应该查看API的文档和示例:

http://docs.h5py.org/en/latest/quick.html

一个简单的示例,其中您要先创建所有数据,然后只想将其保存到hdf5文件,如下所示:

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()

然后,您可以使用以下命令将数据加载回:

In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()

In [13]: np.allclose(a,b)
Out[13]: True

绝对看看文档:

http://docs.h5py.org

写入hdf5文件取决于h5py或pytables(每个文件都具有位于hdf5文件规范之上的不同python API)。您还应该看看numpy本机提供的其他简单二进制格式,例如np.savenp.savez等等:

http://docs.scipy.org/doc/numpy/reference/routines.io.html


顺便说一句。如果在阅读时不事先知道数据集的名称,则必须解析类似于这里的hdf文件。
Trilarion

@JoshAdel,如果我想向数据集中添加一列。我的数据集是一个索引为[img_id,行,列,通道]的多维np.array。并且我已使用您的答案中所述的方法保存了它。我使用h5f ['dataset_1'] [img_id]访问数据集中的所有点。我想要的是一种添加另一列“ mycolumn”的方式...对应于数据集中的每个img_id。我应该如何添加另一列,以便可以执行h5f ['mycolumn'] [img_id]?
iratzhash

如果我这样写矩阵,则无法在HDFView 2.11中看到它们-我可以打开文件,可以看到该数据集data.h5存在,但是无法使用HDFView查看它。我可以使用h5py读取内容,但不能使用HDFView对其进行检查。知道为什么吗?
马丁·托马

104

处理文件打开/关闭并避免内存泄漏的更干净的方法

准备:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such

写:

with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)

读:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]

2
无需关闭文件?
ricoamor

22
@DrDeSancho不,with语句
Leonid

1
在交互模式下运行时特别有用(因为否则可能会从h5py中获得有关已打开文件的异常的信息,因为该文件在第一次尝试未正确关闭的情况下重新运行相同的代码会重新运行该文件)
Andre Holzner

withPython 的功能称为上下文管理器。使用该文件后,将确保关闭文件。官方文档中提供了更多信息:docs.python.org/3/library/contextlib.html
标记
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.