python matlabが書いたmatファイルを読み込む問題と解決方法


最近のプロジェクトではpythonでmatファイルを読み込む必要がありますが、1、データセットサイズが2 GBより大きい場合、Pythonはmatファイルを正しく読み取ることができません.同時にmatlabも対応するファイルを保存することができなくて、-V 7しかありません.3の形式で保存します.具体的には以下の通りです.
#  h5py  -v7.3 .mat  :
import h5py
dict_data = h5py.File('***.mat')    # Python    .mat     
array_data = dict_data['array_name']  
#   array_name     .mat        ,  MATLAB  :save ***.mat array_name -v7.3

 
2、ファイルがh 5 pyで書き込まれると、最終的にpythonが読み取ったデータとmatlabが書き込まれたデータの次元が異なるという問題が発生します.たとえば、書き込みは(1000,128,128,3)ですが、pythonが読み込んだ次元は(128,128,3000)です.したがってpythonが読み取ったファイルを転置する処理が必要である.具体的には以下の通りです.
data_train = h5py.File('train_order6.mat','r')
input_train = data_train['z_wrap']
input_train = np.transpose(input_train,(0,2,1)) #The shape is changed to be consistent with tensoflow [25000,128,128]->[25000,128,128]
input_train = np.expand_dims(input_train,axis=3) #[25000,128,128]->[25000,128,128,1]
label_train = data_train['z_allRegion']
label_train = np.transpose(label_train,(0,3,2,1))#The shape is changed to be consistent with tensoflow [25000,11,128,128]->[25000,128,128,11]

一般的には第1次元と最後の次元が間違っているので(0,3,2,1)の形式ですが、正しいことを確保するためには読み込み時に画像を表示することをお勧めします.
3、matlabで保存するときは、permuteしてpythonが正常に読み取ったり、matlabが正常に記憶したりして、pythonが読み取った後にtransposeしたりすることができます.ステップ2はmatlabが正常に記憶する、pythonが読み取ったtransposeである.