2016-08-19 46 views
-2

scipy.io.loadmat將其加載爲一個奇怪的ndarray,而不是加載MATLAB結構作爲字典(如http://docs.scipy.org/doc/scipy/reference/tutorial/io.html和其他相關問題中所述),其中值是數組的數組,並且字段名稱被認爲是dtype。小例子:scipy.io.loadmat讀取MATLAB(R2016a)結構不正確

(MATLAB):

>> a = struct('b',0) 

a = 

    b: 0 

>> save('simple_struct.mat','a') 

(蟒蛇):

In[1]: 
import scipy.io as sio 
matfile = sio.loadmat('simple_struct.mat') 
a = matfile['a'] 
a 

Out[1]: 
array([[([[0]],)]], 
     dtype=[('b', 'O')]) 

這個問題在Python持續2和3

+2

您是否真的在上面使用的文檔鏈接中閱讀了[MATLAB結構部分](http://docs.scipy.org/doc/scipy/reference/tutorial/io.html#matlab-structs)?看起來這是所有預期的行爲....它繼續描述如何使用'squeeze_me'和'struct_as_record'參數。 – rkersh

+0

不夠緊密!謝謝。我猜這個問題之間[鏈接](http://stackoverflow.com/questions/1984714/how-to-access-fields-in-a-struct-imported-from-a-mat-file-using-loadmat-in -pyth),現在,默認情況下,structs_as_record已成爲True。 –

回答

0

這是正常現象。 Numpy只是顯示你有MATLAB正在存儲你的數據。

MATLAB結構是2 + D單元陣列,其中一個維度映射到一個字符串序列。在Numpy中,這個相同的數據結構稱爲「記錄數組」,而dtype用於存儲名稱。由於MATLAB矩陣必須至少爲2D,因此您存儲在MATLAB中的0實際上是一個尺寸爲(1, 1)的2D矩陣。

所以,你在scipy.io.loadmat看到的是MATLAB如何存儲你的數據(減去dtype位,MATLAB沒有這樣的東西)。具體而言,它是一個2D [1, 1]數組(這是Numpy所稱的單元陣列),其中一個維度映射到一個包含[1, 1]二維數組的字符串。 MATLAB隱藏了你的一些細節,但numpy沒有。