如何在Python中快速读取HDF5文件?

2 投票
1 回答
14285 浏览
提问于 2025-04-18 03:20

我有一个仪器,它会把数据(来自模拟到数字转换器的多个数据轨迹)保存为HDF 5文件。我想知道怎么才能在Python中高效地打开这个文件。我试过以下代码,但提取数据的速度似乎非常慢。

而且,它读取数据的顺序也不对:它不是按1,2,3的顺序读取,而是按1,10,100,1000的顺序读取。

有没有什么好的建议?

这是一个示例数据文件的链接:https://drive.google.com/file/d/0B4bj1tX3AZxYVGJpZnk2cDNhMzg/edit?usp=sharing

这是我那个超级慢的代码:

import h5py
import matplotlib.pyplot as plt
import numpy as np


f = h5py.File('sample.h5','r')

ks = f.keys()

for index,key in enumerate(ks[:10]):
    print index, key
    data = np.array(f[key].values())
    plt.plot(data.ravel())

plt.show()

1 个回答

3

关于你数据的顺序:

In [10]: f.keys()[:10]
Out[10]:
[u'Acquisition.1',
 u'Acquisition.10',
 u'Acquisition.100',
 u'Acquisition.1000',
 u'Acquisition.1001',
 u'Acquisition.1002',
 u'Acquisition.1003',
 u'Acquisition.1004',
 u'Acquisition.1005',
 u'Acquisition.1006']

这是数字的正确排序方式,前面没有用零填充。它是按照字典顺序在排序,而不是按数字大小来排序。你可以查看这个链接 Python: list.sort() doesn't seem to work,里面可能有解决办法。

其次,你在循环中重新构建数组,这样会影响性能:

In [20]: d1 = f[u'Acquisition.990'].values()[0][:]

In [21]: d2 = np.array(f[u'Acquisition.990'].values())

In [22]: np.allclose(d1,d2)
Out[22]: True

In [23]: %timeit d1 = f[u'Acquisition.990'].values()[0][:]
1000 loops, best of 3: 401 µs per loop

In [24]: %timeit d2 = np.array(f[u'Acquisition.990'].values())
1 loops, best of 3: 1.77 s per loop

撰写回答