Sé que esto se ha preguntado anteriormente, pero en mi opinión todavía no hay respuestas que expliquen lo que está sucediendo y que no funcione para mi caso. Tengo un archivo matlab v7.3 que está estructurado como tal,
---> rank ---> each element is f.mat ---> compare ---> each element is
Espero que esto sea lo suficientemente sencillo. Entonces, lo que estoy tratando de hacer es leer las 454 matrices con dimensiones 53×54 de la matriz de celdas llamada ‘rango’, en una lista de matrices numpy en python usando la biblioteca h5py así:
import h5py with h5py.File("f.mat") as f: data = [np.array(element) for element in f['rank']]
Lo que termino es una lista de matrices de referencias de objetos HDF5:
In [53]: data[0] Out[53]: array([], dtype=object)
¿Qué hago con esto / cómo obtengo la lista de arrays que necesito?
Bueno encontré la solución a mi problema. Si alguien más tiene una solución mejor o puede explicar mejor, todavía me gustaría escucharla.
Básicamente, la
necesitaba usarse para indexar el objeto de archivo h5py para obtener la matriz subyacente a la que se hace referencia. Luego de referirnos a la matriz que se necesita, debe cargarse en la memoria indexándola con [:]
o con cualquier subconjunto si solo se requiere parte de la matriz. Esto es lo que quiero decir:
with h5py.File("f.mat") as f: data = [f[element[0]][:] for element in f['rank']]
y el resultado:
In [79]: data[0].shape Out[79]: (50L, 53L) In [80]: data[0].dtype Out[80]: dtype('float64')
Espero que esto ayude a alguien en el futuro. Creo que esta es la solución más general que he visto hasta ahora.
A modo de comparación, en Octave creé y escribí:
X = cell(1,10) for i = 1:10 X{i}=ones(i,i) end save Xcell1 -hdf5 X
luego en Python:
f=h5py.File('Xcell1','r') grp=f['X'] grpv=grp['value'] X=list(grpv.items()) [x[1]['value'].value for x in X[:-1]] # list of those 10 arrays X[-1][1].value # (10,1) the cell array shape
o en una linea
X = [f['/X/value/_0{}/value'.format(i)].value for i in range(0,10)]
Con una función de callback que escribí para https://stackoverflow.com/a/27699851/901925
El archivo se puede ver con:
f.visititems(callback)
productor:
name: X type: b'cell' name: X/value/_00 type: b'scalar' 1.0 name: X/value/_01 type: b'matrix' [[ 1. 1.] [ 1. 1.]] name: X/value/_02 type: b'matrix' [[ 1. 1. 1.] [ 1. 1. 1.] [ 1. 1. 1.]] name: X/value/_03 ... dims: [10 1]