Сохранение и загрузка Python dict с помощью savemat приводит к ошибке - PullRequest
9 голосов
/ 10 февраля 2012

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

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'

Ответы [ 2 ]

11 голосов
/ 10 февраля 2012

Похоже, вы работаете в предположении, что 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 голосов
/ 10 февраля 2012

Похоже, что 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)
...