2012-02-10 21 views
6

Aquí hay un ejemplo mínimo del error que obtengo. Si entendí la documentación correctamente, esto debería estar funcionando, pero parece que no lo hice.Guardar y cargar el dict de Python con los resultados de savemat en el error

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 "<input>", line 1, in <module> 
AttributeError: 'numpy.ndarray' object has no attribute 'keys' 

Respuesta

9

usted parece estar operando bajo la suposición de que scipy.io.savemat pretende ser capaz de guardar un diccionario estándar. No creo que ese sea el caso. El argumento del diccionario contiene los nombres de matrices numpy que se escriben en el archivo Matlab. Así que usted puede 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'] 

que da:

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

Parece que vuelve loadmat recarray en lugar de dict. Lo comprobé con scipy 0.9.0. 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) 
+0

Esto parece no estar funcionando para mí:. B '[ 'a'] dtype.names' devuelve nada y' b [ 'a'] ['test1'] 'devuelve' Traceback (última llamada más reciente): Archivo "", línea 1, en ValueError: campo llamado test1 no encontrado. – Framester

Cuestiones relacionadas