Lees .mat-bestanden in Python

Is het mogelijk om binaire MATLAB .mat-bestanden in Python te lezen?

Ik heb gezien dat SciPy vermeende ondersteuning heeft voor het lezen van .mat-bestanden, maar het lukt me niet. Ik heb SciPy versie 0.7.0 geïnstalleerd en ik kan de loadmat()methode niet vinden.


Antwoord 1, autoriteit 100%

Een import is vereist, import scipy.io

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

Antwoord 2, autoriteit 27%

Noch scipy.io.savemat, noch scipy.io.loadmatwerken voor MATLAB-arrays versie 7.3. Maar het goede is dat MATLAB versie 7.3-bestanden hdf5-datasets zijn. Ze kunnen dus worden gelezen met een aantal tools, waaronder NumPy.

Voor Python heeft u de extensie h5pynodig, waarvoor HDF5 op uw systeem vereist is.

import numpy as np
import h5py
f = h5py.File('somefile.mat','r')
data = f.get('data/variable1')
data = np.array(data) # For converting to a NumPy array

Antwoord 3, autoriteit 4%

Sla eerst het .mat-bestand op als:

save('test.mat', '-v7')

Gebruik daarna in Python de gebruikelijke functie loadmat:

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

Antwoord 4, autoriteit 3%

Er is een mooi pakket genaamd mat4pydat eenvoudig kan worden geïnstalleerd met behulp van

pip install mat4py

Het is eenvoudig te gebruiken (van de website):

Gegevens uit een MAT-bestand laden

De functie loadmatlaadt alle variabelen die zijn opgeslagen in het MAT-bestand in een eenvoudige Python-datastructuur, met alleen Python’s dicten listvoorwerpen. Numerieke en celarrays worden geconverteerd naar in rijen gerangschikte geneste lijsten. Arrays worden samengeperst om arrays met slechts één element te elimineren. De resulterende gegevensstructuur is samengesteld uit eenvoudige typen die compatibel zijn met het JSON-formaat.

Voorbeeld: Laad een MAT-bestand in een Python-datastructuur:

from mat4py import loadmat
data = loadmat('datafile.mat')

De variabele datais een dictmet de variabelen en waarden in het MAT-bestand.

Sla een Python-datastructuur op in een MAT-bestand

Python-gegevens kunnen worden opgeslagen in een MAT-bestand, met de functie savemat. Gegevens moeten op dezelfde manier worden gestructureerd als voor loadmat, dwz ze moeten zijn samengesteld uit eenvoudige gegevenstypen, zoals dict, list, str, inten float.

Voorbeeld: Sla een Python-datastructuur op in een MAT-bestand:

from mat4py import savemat
savemat('datafile.mat', data)

De parameter datazal een dictzijn met de variabelen.


Antwoord 5, autoriteit 2%

Het bestand lezen

import scipy.io
mat = scipy.io.loadmat(file_name)

Het type MAT-variabele inspecteren

print(type(mat))
#OUTPUT - <class 'dict'>

De sleutelsin het woordenboek zijn MATLAB-variabelenen de waardenzijn de objecten die aan die variabelen zijn toegewezen.


Antwoord 6, autoriteit 2%

Als MATLAB 2014b of nieuwer is geïnstalleerd, is de MATLAB-engine voor Pythonkan worden gebruikt:

import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)

Antwoord 7

Er is ook de MATLAB Engine voor Pythondoor MathWorks zelf. Als je MATLAB hebt, is dit misschien het overwegen waard (ik heb het zelf niet geprobeerd, maar het heeft veel meer functionaliteit dan alleen MATLAB-bestanden lezen). Ik weet echter niet of het is toegestaan ​​om het naar andere gebruikers te verspreiden (het is waarschijnlijk geen probleem als die personen MATLAB hebben. Anders is NumPy misschien de juiste manier om te gaan?).

Als u alle basisfuncties zelf wilt doen, biedt MathWorks(als de link verandert, probeer dan te googlen op matfile_format.pdfof de titel MAT-FILE Format) een gedetailleerde documentatie over de structuur van het bestandsformaat. Het is niet zo ingewikkeld als ik persoonlijk dacht, maar dit is natuurlijk niet de gemakkelijkste manier om te gaan. Het hangt ook af van hoeveel functies van de .mat-bestanden je wilt ondersteunen.

Ik heb een “klein” (ongeveer 700 regels) Python-script geschreven dat enkele basis .mat-bestanden kan lezen. Ik ben noch een Python-expert noch een beginner en het kostte me ongeveer twee dagen om het te schrijven (met behulp van de MathWorks-documentatie die hierboven is gelinkt). Ik heb veel nieuwe dingen geleerd en het was best leuk (meestal). Aangezien ik het Python-script op mijn werk heb geschreven, ben ik bang dat ik het niet kan publiceren… Maar ik kan hier wat advies geven:

  • Lees eerst de documentatie.
  • Gebruik een hex-editor (zoals HxD) en bekijk een referentie .mat-bestand dat u wilt ontleden.
  • Probeer de betekenis van elke byte te achterhalen door de bytes op te slaan in een .txt-bestand en elke regel te annoteren.
  • Gebruik klassen om elk gegevenselement op te slaan (zoals miCOMPRESSED, miMATRIX, mxDOUBLEof miINT32)
  • De structuur van .mat-bestanden is optimaal voor het opslaan van de data-elementen in een boomdatastructuur; elk knooppunt heeft één klasse en subknooppunten

Antwoord 8

Er is een geweldige bibliotheek voor deze taak genaamd: pymatreader.

Doe gewoon als volgt:

  1. Installeer het pakket: pip install pymatreader

  2. Importeer de relevante functie van dit pakket: from pymatreader import read_mat

  3. Gebruik de functie om de matlab-struct te lezen: data = read_mat('matlab_struct.mat')

  4. gebruik data.keys()om te achterhalen waar de gegevens daadwerkelijk zijn opgeslagen.

  • De sleutels zien er meestal als volgt uit: dict_keys(['__header__', '__version__', '__globals__', 'data_opp']). Waar data_oppde daadwerkelijke sleutel is die de gegevens opslaat. De naam van deze sleutel kan natuurlijk worden gewijzigd tussen verschillende bestanden.
  1. Laatste stap – Maak uw dataframe: my_df = pd.DataFrame(data['data_opp'])

Dat is het 🙂


Antwoord 9

Mat-bestand lezen naar panda’s dataFrame met gemengde gegevenstypen

import scipy.io as sio
mat=sio.loadmat('file.mat')# load mat-file
mdata = mat['myVar']  # variable in mat file 
ndata = {n: mdata[n][0,0] for n in mdata.dtype.names}
Columns = [n for n, v in ndata.items() if v.size == 1]
d=dict((c, ndata[c][0]) for c in Columns)
df=pd.DataFrame.from_dict(d)
display(df)

Antwoord 10

from os.path import dirname, join as pjoin
import scipy.io as sio
data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data')
mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
mat_contents = sio.loadmat(mat_fname)

Je kunt bovenstaande code gebruiken om het standaard opgeslagen .mat-bestand in Python te lezen.


Antwoord 11

Kan ook de hdf5storage-bibliotheek gebruiken. officiële documentatie hiervoor details over de matlab-versie ondersteuning.

import hdf5storage
label_file = "./LabelTrain.mat"
out = hdf5storage.loadmat(label_file) 
print(type(out)) # <class 'dict'>

Antwoord 12

Afgezien van scipy.io.loadmatvoor v4 (niveau 1.0), v6, v7 tot 7.2 matfiles en h5py.Filevoor matfiles in 7.3-formaat, is er een ander type van matfiles in tekstgegevensformaatin plaats van binair, meestal gemaakt door Octave, dat kan zelfs niet worden gelezen in MATLAB.

Beide scipy.io.loadmaten h5py.Filekunnen ze niet laden (getest op scipy 1.5.3 en h5py 3.1.0), en de enige oplossing die ik heb gevonden is numpy.loadtxt.

import numpy as np
mat = np.loadtxt('xxx.mat')

Other episodes