2014-04-19 58 views
2

我有一臺儀器將HDF 5文件中的數據(來自模數轉換器的許多跡線)保存起來。我如何有效地在python中打開這個文件?我嘗試了下面的代碼,但它似乎需要很長時間才能提取數據。在Python中快速讀取HDF 5文件?

另外,它以錯誤的順序讀取數據:而不是讀取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() 

回答

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 
+0

由於喬希!但plt.plot似乎不想繪製數據,除非我使用np.array()函數。有沒有另一種方法來做到這一點? – DanHickstein

+0

@DanHickstein我更新了我的答案來解決這個問題。這假設每個'f [key] .values()'只包含一個感興趣的項目,這似乎是我迅速查看的數據的情況。 – JoshAdel

+0

啊!在我看到你的答案彈出之前,我想了一下。謝謝 :) – DanHickstein