it-swarm.com.de

lesen der v 7.3 matten Datei in Python

Ich versuche, eine Matlab-Datei mit dem folgenden Code zu lesen

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

und es gibt mir den folgenden Fehler

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

so konnte jeder bitte das gleiche Problem haben und könnte jeden Beispielcode gefallen

vielen Dank

35
Shan

Versuchen Sie es mit 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)

sie sollten mit Ihren Daten im arrays-Dikt landen, es sei denn, Sie haben MATLAB-Strukturen, vermute ich. Ich hoffe es hilft!

13
norok2

Per Magu_s Antwort auf einen verwandten Thread , check das Paket hdf5storage aus, das praktische Funktionen zum Lesen von Matlab-Dateien der Version 7.3 enthält; es ist so einfach wie

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

Ich habe mir dieses Problem angesehen: https://github.com/h5py/h5py/issues/726 . Wenn Sie Ihre Mat-Datei mit der Option -v7.3 gespeichert haben, sollten Sie die Liste der Schlüssel mit (unter Python 3.x) generieren:

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

Um beispielsweise auf die Variable a zugreifen zu können, müssen Sie denselben Trick verwenden: 

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

Laut dem Scipy-Kochbuch. http://wiki.scipy.org/Cookbook/Reading_mat_files

Ab Version 7.3 von Matlab werden Mat-Dateien standardmäßig im HDF5-Format gespeichert (außer, wenn Sie beim Speichern das Flag -vX verwenden, siehe Hilfe beim Speichern in Matlab). Diese Dateien können in Python unter Verwendung des Pakets PyTables oder h5py gelesen werden. Das Lesen von Matlab-Strukturen in Mat-Files scheint an dieser Stelle nicht unterstützt zu werden.

Vielleicht können Sie Octave verwenden, um mit dem Flag -vX erneut zu speichern.

5
lee

Trotz stundenlangem Suchen habe ich auch nicht gefunden, wie man auf Matlab v7.3-Strukturen zugreifen kann. Ich hoffe, dass diese teilweise Antwort jemandem helfen wird, und ich würde mich sehr freuen, zusätzliche Hinweise zu sehen. 

Beginnend mit (ich denke, die [0] [0] entsteht aus Matlab, die alles auf die Dimensionen verteilt):

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

gibt: <HDF5-Objektreferenz>

Übergeben Sie diese Referenz erneut an f:

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

das gibt ein Array: konvertiert dieses in ein Numpy-Array und extrahiert den Wert (oder rekursiv eine andere <HDF5-Objektreferenz>:

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

Wenn der Zugriff auf die Festplatte langsam ist, kann das Laden in den Speicher möglicherweise helfen.


Weitere Bearbeitung: Nach langem vergeblichen Suchen meines letzten Workarounds (ich hoffe wirklich, dass jemand anderes eine bessere Lösung hat!) Rief ich Matlab aus Python an, was ziemlich einfach und schnell ist:

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