web-dev-qa-db-fra.com

lecture du fichier mat v 7.3 en python

J'essaie de lire un fichier matlab avec le code suivant

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

et cela me donne l'erreur suivante

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

quelqu'un pourrait-il s'il vous plaît avoir le même problème et pourrait plaire à tout code

merci

35
Shan

Essayez d’utiliser h5py module

import h5py
with h5py.File('test.mat', 'r') as f:
    f.keys()
35
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)

vous devriez vous retrouver avec vos données dans le arrays dict, sauf si vous avez des structures MATLAB, je suppose. J'espère que ça aide!

13
norok2

Per La réponse de Magu_ sur un fil connexe , consultez le package hdf5storage qui dispose de fonctions pratiques pour lire les fichiers v7.3 matlab; c'est aussi simple que

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

J'ai jeté un oeil à cette question: https://github.com/h5py/h5py/issues/726 . Si vous avez enregistré votre fichier mat avec l'option -v7.3, vous devez générer la liste des clés avec (sous Python 3.x):

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

Pour accéder à la variable a par exemple, vous devez utiliser le même truc: 

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

Selon le livre de recettes Scipy. http://wiki.scipy.org/Cookbook/Reading_mat_files

À partir de la version 7.3 de Matlab, les fichiers mat sont en fait enregistrés au format HDF5 par défaut (sauf si vous utilisez l'indicateur -vX au moment de la sauvegarde, voir l'aide relative à l'enregistrement dans Matlab). Ces fichiers peuvent être lus en Python en utilisant, par exemple, le package PyTables ou h5py. La lecture des structures Matlab dans les fichiers mat ne semble pas prise en charge à ce stade.

Vous pourriez peut-être utiliser Octave pour ré-enregistrer en utilisant le drapeau -vX.

5
lee

Malgré des heures de recherche, je n'ai pas trouvé non plus comment accéder aux structures de Matlab v7.3. Espérons que cette réponse partielle aidera quelqu'un, et je serais très heureux de voir des indicateurs supplémentaires. 

Donc, à commencer par (je pense que le [0] [0] provient de Matlab qui donne tout en dimensions):

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

donne: <référence d'objet HDF5>

Passez cette référence à f à nouveau:

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

qui donne un tableau: convertit-le en tableau numpy et extrait la valeur (ou, récursivement, une autre <référence d'objet HDF5>:

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

Si l'accès au disque est lent, peut-être que le chargement en mémoire aiderait.


Après une recherche bien inutile, ma dernière solution (j'espère vraiment que quelqu'un d'autre a une meilleure solution!) Appelle Matlab depuis Python, ce qui est assez facile et rapide:

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)
0
Stephen Morrell