Effacer les filtres
Effacer les filtres

matファイル(v7​.3)をpython​で開く方法を教えて下​さい

196 vues (au cours des 30 derniers jours)
Yutaro Ueoka
Yutaro Ueoka le 6 Avr 2023
csvファイル→(matlabで読み込み→処理→matファイル保存)→matファイル → python読み込み
という流れが行いたいのですが、下記(===具体的なコード等=== 以下)のように上手くできません。
matlabで処理した後csvファイルに保存すると容量がとても大きく保存に掛かる時間、容量の問題があるためできればmatファイルで処理したいです。
  • 上手く処理できる方法
  • matファイルと同等の保存処理時間、容量で他にpythonに読み込みやすい形式
のどちらかをご存知の方がいらっしゃれば教えて頂きたいです。どうぞ宜しくお願い致します。
====具体的なコード等======================
a b c
1 5 9
2 6 10
3 7 11
4 8 12
上のようなcsvファイルtmp.csvをmatlabで
%% in matlab
tb = readtable('tmp.csv')
save("tmp.mat",'tb',"-v7.3")
としてtmp.matファイル(-v7.3)として保存します。
このtmp.matファイルをpythonのh5pyモジュールを用いて読み込もうとすると、
%% in python
>>> dfmat = h5py.File('tmp.mat','r')
>>> dfmat
<HDF5 file "tmp.mat" (mode r)>
>>> dfmat.keys()
<KeysViewHDF5 ['#refs#', '#subsystem#', 'tb']>
>>> pd.DataFrame(dfmat.get('tb'))
0 1 2 3 4 5
0 -587202560 2 1 1 1 1
>>> dfmat['tb'][0]
array([3707764736,2,1,1,1,1], dtype=uint32)
という形になってしまい、元のcsvファイルの内容が復元できません。

Réponse acceptée

交感神経優位なあかべぇ
Modifié(e) : 交感神経優位なあかべぇ le 9 Avr 2023
scipyを使用した例を記述します。しかし、scipy.io.loadmatは、mat(-v7.3)は非対応ですので、mat(-v7)で保存しています。
%in matlab
tb = readtable('tmp.csv')
variableNames = tb.Properties.VariableNames;
% scipy.io.loadmatはテーブル型を読み込めないので、テーブル型をそれぞれの変数にして保存する。
for i = 1 : length(variableNames)
eval([variableNames{i}, '=tb{:,i};']);
end
save('tmp.mat', variableNames{:});% mat(-v7)で保存
%in python
import scipy
data = scipy.io.loadmat('tmp.mat')
a = data['a']% matに保存した変数の呼び出し
  2 commentaires
Yutaro Ueoka
Yutaro Ueoka le 19 Avr 2023
お返事遅くなってしまいすみません。
-v7で保存しても-v7.3同様のエラー文が出てきた気もするのですが、-v6だとこれで出来ました。
ありがとうございます!
交感神経優位なあかべぇ
解決したようでよかったです。
一応私の環境だと、-v7で動作しました。

Connectez-vous pour commenter.

Plus de réponses (1)

Hiro Yoshino
Hiro Yoshino le 10 Avr 2023
Modifié(e) : Hiro Yoshino le 10 Avr 2023
MATLAB Engine を Python で利用するのはどうでしょうか? (推奨の MATLAB - Python 連携方法になります)
  1. MATLAB で **.mat としてデータを保存
  2. MATLAB Engine を使って Python から MATLAB 関数を利用
  3. load 関数を Python から呼ぶ
以下、Python での実装:
import matlab.engine
eng = matlab.engine.start_matlab()
mat_data = eng.load("myMAT","myVariable")
print(mat_data)
mat_data は matlab.double で戻ってくるので、Python で使えるように変換する必要がありますが、この方法が MATLAB - Python 連携の推奨方法です。
  2 commentaires
Yutaro Ueoka
Yutaro Ueoka le 19 Avr 2023
お返事遅くなってしまいすみません。
matlab.engineをインストールするところまでは出来るのですが、importで色々エラーが出てしまいました。今回はもう .matファイルではなく、csvファイルで保存して、bzip2で圧縮してサーバーに投げるようにしました。
ただ、今回紹介していただいた方法がMATLAB-Python連携の推奨方法なのですね。今後また必要になればこちらを試して見ようと思います。ありがとうございます。
Hiro Yoshino
Hiro Yoshino le 19 Avr 2023
MATLAB - Python の互換性のシステム要求を満たしているか、今一度ご確認ください。

Connectez-vous pour commenter.

Catégories

En savoir plus sur Python からの MATLAB の呼び出し dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!