Guardar y cargar dict de Python con resultados de savemat en error

Aquí hay un ejemplo mínimo del error que recibo. Si entendí la documentación correctamente, esto debería estar funcionando, pero parece que no lo hice.

a={} a['test1']=1 a['test2']=2 a['test3']=3 import scipy.io as io io.savemat('temp',{'a':a}) b = io.loadmat('temp') b['a'].keys() Traceback (most recent call last): File "", line 1, in  AttributeError: 'numpy.ndarray' object has no attribute 'keys' 

Parece que está operando bajo el supuesto de que scipy.io.savemat está diseñado para poder guardar un diccionario estándar. No creo que ese sea el caso. El argumento del diccionario contiene los nombres de matrices numpy que están escritas en el archivo Matlab. Así que puedes hacer algo como esto

 import scipy.io as io import numpy as np y1=np.array([1,2,3,4]) y2=np.array([10,20,30,40]) y3=np.array([100,200,300,400]) a={} a['test1']=y1 a['test2']=y2 a['test3']=y3 io.savemat('temp',a) b = io.loadmat('temp') print b['test1'] print b['test2'] print b['test3'] 

lo que da:

 [[1] [2] [3] [4]] [[10] [20] [30] [40]] [[100] [200] [300] [400]] 

Parece que el loadmat devuelve el recarray en lugar del dict. Lo comprobé con scipy 0.9.0. El equivalente de b['a'].keys() será b['a'].dtype.names .

Ejemplos:

 In [12]: b['a'].shape Out[13]: (1, 1) In [14]: b['a'].dtype.names Out[16]: ('test1', 'test3', 'test2') In [17]: b['a']['test1'] Out[17]: array([[[[1]]]], dtype=object)