保存和加载Python字典时使用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'
2 个回答
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)
11
你似乎认为 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]]