【问题标题】:Quickly read HDF 5 file in python?在 python 中快速读取 HDF 5 文件?
【发布时间】:2014-06-03 13:59:25
【问题描述】:

我有一台将数据(来自模数转换器的许多迹线)保存为 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()

【问题讨论】:

    标签: python numpy scipy hdf5 h5py


    【解决方案1】:

    就数据的顺序而言:

    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
    

    【讨论】:

    • 谢谢乔希!但是 plt.plot 似乎不想绘制数据,除非我使用 np.array() 函数。还有其他方法吗?
    • @DanHickstein 我更新了我的答案来解决这个问题。这假设每个f[key].values() 只包含一个感兴趣的项目,从我快速查看的数据来看似乎就是这种情况。
    • 啊!在看到您的答案弹出之前,我就想通了。谢谢:)
    猜你喜欢
    • 2014-08-05
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2021-09-27
    • 2013-07-29
    • 1970-01-01
    相关资源
    最近更新 更多