Saving and loading Python dict with savemat results in error
Frage
Here is an minimal example of the error I get. If I understood the documentation correctly, this should be working, but it seems I did not.
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'
Lösung
You seem to be operating under the assumption that scipy.io.savemat
is intended to be able to save a standard dictionary. I don't believe that is the case. The dictionary argument holds the names of numpy arrays which are written out into the Matlab file. So you can do something like this
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']
which gives:
[[1]
[2]
[3]
[4]]
[[10]
[20]
[30]
[40]]
[[100]
[200]
[300]
[400]]
Andere Tipps
It looks like loadmat returns recarray instead of dict.
I checked with scipy 0.9.0.
Equivalent of b['a'].keys()
will be b['a'].dtype.names
.
Examples:
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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow