2016-08-19 20 views
-2

dictとしてMATLAB構造体をロードするのではなく(http://docs.scipy.org/doc/scipy/reference/tutorial/io.htmlとその他の質問に記載されています)、scipy.io.loadmatはそれを奇妙なndarrayとしてロードします。値は配列の配列で、フィールド名は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の構造体は、1次元が一連の文字列にマップされる2 + Dセル配列です。 Numpyでは、この同じデータ構造を「レコード配列」と呼び、dtypeを使用して名前を格納します。また、MATLAB行列は少なくとも2Dでなければならないため、MATLABに格納されている0は実際には次元が(1, 1)の2D行列です。

scipy.io.loadmatには、MATLABがデータをどのように格納しているのかがわかります(dtypeビットを除いて、MATLABにはそのようなことはありません)。具体的には、2D [1, 1]配列(Numpyがセル配列を呼び出す配列)であり、1次元が文字列にマップされ、[1, 1] 2D配列を含みます。 MATLABはこれらの詳細の一部を隠していますが、numpyはそれを隠しています。

関連する問題