2012-01-12 18 views
16

¿Cómo puedo poner una matriz nudosa multidimensional en un archivo HDF5 usando PyTables?Python: cómo almacenar una matriz nudosa multidimensional en PyTables?

Por lo que puedo decir, no puedo poner un campo de matriz en una tabla de tablas.

También necesito almacenar algo de información sobre esta matriz y ser capaz de realizar cálculos matemáticos en ella.

¿Alguna sugerencia?

+8

Honestamente, si usted está almacenando una gran cantidad de sólo hacia arriba matrices ND, es mejor con 'h5py' en lugar de' pytables'. Es tan simple como 'f.create_dataset ('name', data = x)' donde 'x' es tu matriz numpy y' f' es el archivo hdf abierto. Hacer lo mismo en 'pytables' es posible, pero considerablemente más difícil. –

+0

Joe, +1. Estaba a punto de publicar un comentario casi idéntico. –

+0

Pensé en eso, pero Pytables tiene algunas características (tables.expr) para hacer cálculos directamente en las matrices, ¿puedo tener eso con h5py? – scripts

Respuesta

32

Puede haber una manera más sencilla, pero esta es la forma en que le van haciendo sobre él, por lo que yo sé:

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

Si desea especificar la compresión de usar, echar un vistazo a tables.Filters. P.ej.

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

Probablemente hay una manera más sencilla para un montón de esto ... No he utilizado para otra cosa que pytables datos de la tabla, como cualquier cosa en mucho tiempo.

Nota: con PyTables 3.0, f.createCArray se renombró a f.create_carray. También puede aceptar la matriz directamente, sin especificar el atom,

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

gracias a que funcionó impecablemente !! – scripts

+5

Tenga en cuenta que esto ahora se puede hacer mucho más directamente utilizando el método create_array en los objetos de archivo, como se describe en la sección 'Creación de nuevos objetos de matriz' en http://pytables.github.io/usersguide/tutorials.html –

Cuestiones relacionadas