2012-01-12 30 views
16

Come posso mettere un array multidimensionale NumPy in un file utilizzando HDF5 PyTables?Python: come immagazzinare una matrice multidimensionale numpy in PyTables?

Da quello che posso dire che non posso mettere un campo di matrice in una tabella pytables.

ho anche bisogno di memorizzare alcune informazioni su questa matrice ed essere in grado di fare calcoli matematici su di esso.

Qualche suggerimento?

+8

Onestamente, se si sta memorizzare un sacco di solo verso l'alto array ND, si sta meglio con 'h5py' invece di' pytables'. È semplice come 'f.create_dataset ('name', data = x)' dove 'x' è la tua matrice numpy e' f' è il file hdf aperto. Fare la stessa cosa in 'pytables' è possibile, ma considerevolmente più difficile. –

+0

Joe, +1. Stavo per pubblicare un commento quasi identico. –

+0

Ho pensato a questo, ma pytables ha alcune funzionalità (tabelle.expr) per eseguire calcoli direttamente sugli array, posso averli con h5py? – scripts

risposta

32

Ci può essere un modo più semplice, ma questo è il modo che ci si andare a farlo, per quanto ne so:

import numpy as np 
import tables 

# Generate some data 
x = np.random.random((100,100,100)) 

# Store "x" in a chunked array... 
f = tables.openFile('test.hdf', 'w') 
atom = tables.Atom.from_dtype(x.dtype) 
ds = f.createCArray(f.root, 'somename', atom, x.shape) 
ds[:] = x 
f.close() 

Se si desidera specificare la compressione da utilizzare, dare un'occhiata a tables.Filters. Per esempio.

import numpy as np 
import tables 

# Generate some data 
x = np.random.random((100,100,100)) 

# Store "x" in a chunked array with level 5 BLOSC compression... 
f = tables.openFile('test.hdf', 'w') 
atom = tables.Atom.from_dtype(x.dtype) 
filters = tables.Filters(complib='blosc', complevel=5) 
ds = f.createCArray(f.root, 'somename', atom, x.shape, filters=filters) 
ds[:] = x 
f.close() 

C'è probabilmente un modo più semplice per un sacco di questo ... Non ho usato pytables per altro che i dati della tabella, come in un lungo tempo.

Nota: con pytables 3.0, f.createCArray è stato rinominato f.create_carray. Si può anche accettare la matrice direttamente, senza specificare la atom,

f.create_carray('/', 'somename', obj=x, filters=filters) 
+0

grazie ha funzionato senza problemi !! – scripts

+5

Si noti che questo può ora essere fatto molto più semplicemente utilizzando il metodo create_array su oggetti file, come descritto nella sezione 'Creazione di nuovi oggetti array' a http://pytables.github.io/usersguide/tutorials.html –

Problemi correlati