2016-09-01 5 views
6
% save .mat file in the matlab  
train_set_x=1:50*1*51*61*23; 
train_set_x=reshape(train_set_x,[50,1,51,61,23]); 
save(['pythonTest.mat'],'train_set_x','-v7.3'); 

matlabで取得されたデータのサイズは(50,1,51,61,23)です。Pythonで.matファイルを読む。しかし、データの形状が変更されました

このlinkの命令でPythonで.matファイルを読み込みます。次のように

コードは次のとおり

import numpy as np, h5py 
f = h5py.File('pythonTest.mat', 'r') 
train_set_x = f.get('train_set_x') 
train_set_x = np.array(train_set_x) 

train_set_x.shapeの出力が(23L, 61L, 51L, 1L, 50L)です。それは(50L, 1L, 51L, 61L, 23L)であると予想されます。だから私は形状を変更しました

train_set_x=np.transpose(train_set_x, (4,3,2,1,0)) 

私はPythonとmatlabの間のデータ形状の変化について興味があります。私のコードにいくつかのエラーがありますか?

+1

:http://stackoverflow.com/q/24116713

ところで、代わりにtrain_set_xを転置、あなたは "Fortranの" オーダー(COL-主要Matlabの中など)への順序を設定してみてください/ 1714410 – Shai

+0

以前の '.mat'バージョンでは、' scipy.io.loadmat'はMATLABと同じ形状の配列を生成しますが、 'order = 'F''です。したがって、この違いを隠すことになります。 – hpaulj

+0

@hpaulj:あなたは早期にどういう意味ですか? 「遅い」マットバージョンの動作変更は何ですか? – Eric

答えて

4

コードにエラーはありません。 MatlabとPythonの間には多次元配列を扱う方法に基本的な違いがあります。
Matalbとpythonの両方は、マルチディミング配列のすべての要素をメモリ内の単一の連続ブロックとして格納します。違いは要素の順序である:
Matlabの、(FORTRAN等)カラム最初のファッションの要素を格納し、それは、2Dのために、アレイの大きさに応じて要素を記憶している。

[1 3; 
    2 4] 

[1 2; 
3 4]; 

だからブロックメモリで:対照的に

パイソンは、それが配列の最後次元から開始して、行最初のファッションの要素を格納しますMatlabののサイズ[m,n,k]は、Pythonによっての形の形で表示されます。 です。

詳細については、this wiki pageを参照してください。関連

train_set_x = np.array(train_set_x, order='F') 
+0

'order = 'F''を設定したときに結果が転置と異なるのですか?それとも、メモリの使用量に違いはありますか? – Ian

+0

は 'numpy'転置でO(1)操作です:メモリ内の要素を再配置せず、配列のメタデータのみをハングします(その' 'strides')(http://docs.scipy.org/ doc/numpy/reference/generated/numpy.ndarray.strides.html))。 'strides'と' shape'を 'order =" F "'と読み替えて転置することを比較できると思います。私はこれらの2つのメソッドが同じオブジェクトになると思います。 – Shai

+0

ありがとう!移調が同じ結果をもたらす場合でも、 'order'引数について知ることは良いことです。 – Ian

関連する問題