2012-02-10 1 views
6

Вот минимальный пример ошибки, которую я получаю. Если я правильно понял документацию, это должно работать, но, похоже, я этого не сделал.Сохранение и загрузка Python dict с помощью savemat приводит к ошибке

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' 

ответ

9

Вы, кажется, работает в предположении, что scipy.io.savemat предназначено, чтобы быть в состоянии сохранить стандартный словарь. Я не верю, что это так. Аргумент словаря содержит имена массивов numpy, которые записываются в файл Matlab. Таким образом, вы можете сделать что-то вроде этого

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'] 

, который дает:

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

Похоже loadmat возвращает recarray вместо Dict. Я проверил с scipy 0.9.0. Эквивалент b['a'].keys() будет b['a'].dtype.names.

Примеры:

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

Это, кажется, не работает для меня. 'B [ 'а'] dtype.names' ничего не возвращает и' B [ 'a'] ['test1'] 'возвращает' Traceback (последний последний вызов): Файл «», строка 1, в ValueError: поле с именем test1 не найдено. ' – Framester