lea el archivo matlab v7.3 en la lista de python de matrices numpy a través de h5py

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]