さて、問題は Python 自体ではなく pickle にあります。他の人が言及したように、バージョン 7.3 以降で保存された .mat ファイルは HDF5 形式を使用します。HDF5 は、大規模なデータセットを効率的に保存および取得できるように最適化されています。Pickle はデータを異なる方法で処理します。h5py または netcf4 Python モジュールを使用することで、Matlab の save 関数のパフォーマンスを再現するか、それを超えることさえできます。NetCDF は HDF5 のサブセットです。たとえば、HDF5 を使用すると、次のことができます。
import h5py
import numpy as np
f = h5py.File('test.hdf5','w')
a = np.arange(10)
dset = f.create_dataset("init", data=a)
f.close()
MATLAB で同等の処理を行ってもまったく同じサイズのファイルになるかどうかはわかりませんが、近いはずです。HDF5 の圧縮機能をいじって、必要な結果を得ることができます。
編集1:
file などの HDF5 ファイルをロードするには、次の.mat
ようにしますM2 = h5py.File('file.mat')
。M2 は HDF5 グループで、python 辞書のようなものです。実行M2.keys()
すると、変数名が得られます。変数の 1 つが「data」という配列である場合は、 を実行して読み取ることができますdata = M2["data"][:]
。
編集2:
複数の変数を保存するために、複数のデータセットを作成できます。基本的な構文はf.create_dataset("variable_name", data=variable)
. その他のオプションについては、リンクを参照してください。例えば
import h5py
import numpy as np
f = h5py.File('test.hdf5','w')
data1 = np.ones((4,4))
data2 = 2*data1
f.create_dataset("ones", data=data1)
f.create_dataset("twos", data=data2)
f
ファイル オブジェクトと HDF5 グループの両方です。したがって、次のようになりf.keys()
ます。
[u'ones', u'twos']
「ones」キーの下に保存されているものを表示するには、次のようにします。
f['ones'][:]
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
データセットはいくつでも作成できます。ファイルの書き込みが完了したら、ファイル オブジェクトを閉じます: f.close()
.
ここでの私のアプローチは、配列のようなデータセットに対してのみ機能することを付け加えておきます。リストや辞書など、他の Python オブジェクトを保存することもできますが、それにはもう少し作業が必要です。私は、大規模な numpy 配列に対してのみ HDF5 に頼っています。他のすべてについては、ピクルは私にとってはうまく機能します。