Leggere rapidamente HDF 5 file in python?

Ho uno strumento che consente di salvare i dati (molte tracce da un analog-to-digital converter) come HDF 5 file. Come posso efficiente aprire questo file in python? Ho provato il seguente codice, ma sembra prendere un tempo molto lungo per estrarre i dati.

Anche, legge i dati nell’ordine sbagliato: invece di leggere 1,2,3, legge 1,10,100,1000.

Tutte le idee?

Qui c’è un link per il file di dati di esempio: https://drive.google.com/file/d/0B4bj1tX3AZxYVGJpZnk2cDNhMzg/edit?usp=sharing

E qui è il mio super-slow codice:

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()

 

One Reply
  1. 3

    Quanto riguarda l’ordine dei dati:

    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']

    Questo è l’ordine corretto per i numeri che non è di sinistra riempite con zeri. Fa il suo ordinamento lexicographically, non numericamente. Vedere Python: elenco.sort() non sembra funzionare per una possibile soluzione.

    Secondo, si sta uccidendo i risultati per la ricostruzione dell’array all’interno del ciclo:

    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
    • Grazie Josh! Ma pal.la trama non sembra voler tracciare i dati a meno di non utilizzare la np.array() funzione. C’è un altro modo per fare questo?
    • Ho aggiornato la mia risposta per risolvere il problema. Questo presuppone che ogni f[key].values() contiene solo un elemento di interesse, che sembra essere il caso, dai dati che ho subito guardato.
    • Ah! Ho capito questo, solo un momento, prima ho visto la tua risposta pop-up. Grazie 🙂

Lascia un commento