web-dev-qa-db-ja.com

pythonのv 7.3マットファイルの読み取り

次のコードでmatlabファイルを読み取ろうとしています

import scipy.io
mat = scipy.io.loadmat('test.mat')

そして、それは私に次のエラーを与えます

raise NotImplementedError('Please use HDF reader for matlab v7.3 files')
NotImplementedError: Please use HDF reader for matlab v7.3 files

だから誰でも同じ問題を抱えていて、サンプルコードを喜ばせることができます

ありがとう

47
Shan

h5py モジュール

import h5py
with h5py.File('test.mat', 'r') as f:
    f.keys()
42
Shai
import h5py
import numpy as np
filepath = '/path/to/data.mat'
arrays = {}
f = h5py.File(filepath)
for k, v in f.items():
    arrays[k] = np.array(v)

mATLAB構造がない限り、データはarrays dictで終わるはずです。それが役に立てば幸い!

21
norok2

関連するスレッドに関する Magu_の回答ごとに 、v7.3 matlab matファイルを読み取るための便利な機能を備えたパッケージ hdf5storage を確認してください。それは簡単です

import hdf5storage
mat = hdf5storage.loadmat('test.mat')
13
Maxim

私はこの問題を見ました: https://github.com/h5py/h5py/issues/726-v7.3オプションを使用してmatファイルを保存した場合、(Python 3.x)の下でキーのリストを生成する必要があります。

import h5py
with h5py.File('test.mat', 'r') as file:
    print(list(file.keys()))

たとえば、変数aにアクセスするには、同じトリックを使用する必要があります。

with h5py.File('test.mat', 'r') as file:
    a = list(file['a'])
10
Léonard

Scipyクックブックによると。 http://wiki.scipy.org/Cookbook/Reading_mat_files

Matlabのリリース7.3以降、matファイルは実際にはデフォルトでHDF5形式を使用して保存されます(保存時に-vXフラグを使用する場合を除き、Matlabの保存を参照してください)。これらのファイルは、Pythonを使用して、たとえばPyTablesまたはh5pyパッケージを使用して読み取ることができます。この時点では、Matlab構造の読み取りはサポートされていないようです。

おそらく、-vXフラグを使用してOctaveを再保存できます。

5
lee

何時間にもわたる検索にも関わらず、Matlab v7.3構造にアクセスする方法も見つけられませんでした。この部分的な答えが誰かの助けになることを願っています。また、追加のポインタを見つけてとてもうれしいです。

そのため、([0] [0]はMatlabが次元にすべてを与えることから生じると思います):

f = h5py.File('filename', 'r')
f['varname'][0][0]

与える:<HDF5オブジェクト参照>

この参照を再びfに渡します。

f[f['varname'][0][0]]

これは配列を提供します:これをnumpy配列に変換し、値を抽出します(または再帰的に、別の<HDF5オブジェクト参照>:

np.array(f[f['varname'][0][0]])[0][0]

ディスクへのアクセスが遅い場合は、メモリへのロードが役立つ可能性があります。


さらに編集:最終的な回避策を探して無駄に検索した後(他の誰かがより良い解決策を持っていることを本当に願っています!)pythonからMatlabを呼び出しました。

eng = matlab.engine.start_matlab()  # first fire up a Matlab instance
eng.quit()
eng = matlab.engine.connect_matlab()  # or connect to an existing one
eng.sqrt(4.0)
x = 4.0
eng.workspace['y'] = x
a = eng.eval('sqrt(y)')
print(a)
x = eng.eval('parameterised_function_in_Matlab(1, 1)', nargout=1)
a = eng.eval('Structured_variable{1}{2}.object_name')  # (nested cell, cell, object)
3
Stephen Morrell