Saving and loading a Python dict using savemat results in an error

Here is a minimal example of the error I get. If I understood the documentation correctly, this should work, but it seems that 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' 
+6
source share
2 answers

You seem to be working on the assumption that scipy.io.savemat designed to preserve a standard dictionary. I do not believe that this is so. The dictionary argument contains the names of the numpy arrays that are written to 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]] 
+9
source

It looks like loadmat returns a recarray instead of a dict. I checked with scipy 0.9.0. The 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) 
+2
source

Source: https://habr.com/ru/post/908168/


All Articles