2012-02-10 20 views
6

這是我得到的一個最小錯誤示例。如果我正確理解了文檔,這應該是有效的,但似乎我沒有。用savemat保存並加載Python字典導致出錯

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而不是字典。 我用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']'return'Traceback(最近一次調用的最後一個):文件「」,第1行,在 ValueError:未找到名爲test1的字段。 – Framester 2012-02-13 08:20:41