88

次のコードで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

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

ありがとう

4

9 に答える 9

11

この問題を見ました: https://github.com/h5py/h5py/issues/726。オプションでmat ファイルを保存した場合は-v7.3、(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'])
于 2017-09-21T12:35:23.650 に答える
6

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

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

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

于 2015-06-17T00:10:27.790 に答える
3

この関数は、Matlab で生成された HDF5 .mat ファイルを読み取り、Numpy 配列のネストされた辞書の構造を返します。Matlab は Fortran の順序で行列を書き込むため、行列と高次元配列も従来の Numpy の順序に転置しますarr[..., page, row, col]

import h5py

def read_matlab(filename):
    def conv(path=''):
        p = path or '/'
        paths[p] = ret = {}
        for k, v in f[p].items():
            if type(v).__name__ == 'Group':
                ret[k] = conv(f'{path}/{k}')  # Nested struct
                continue
            v = v[()]  # It's a Numpy array now
            if v.dtype == 'object':
                # HDF5ObjectReferences are converted into a list of actual pointers
                ret[k] = [r and paths.get(f[r].name, f[r].name) for r in v.flat]
            else:
                # Matrices and other numeric arrays
                ret[k] = v if v.ndim < 2 else v.swapaxes(-1, -2)
        return ret

    paths = {}
    with h5py.File(filename, 'r') as f:
        return conv()
于 2019-09-20T10:04:36.830 に答える