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.loadmat
werken 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 h5py
nodig, 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 mat4py
dat 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 loadmat
laadt alle variabelen die zijn opgeslagen in het MAT-bestand in een eenvoudige Python-datastructuur, met alleen Python’s dict
en list
voorwerpen. 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 data
is een dict
met 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
, int
en float
.
Voorbeeld: Sla een Python-datastructuur op in een MAT-bestand:
from mat4py import savemat
savemat('datafile.mat', data)
De parameter data
zal een dict
zijn 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.pdf
of 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
,mxDOUBLE
ofmiINT32
) - 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:
-
Installeer het pakket:
pip install pymatreader
-
Importeer de relevante functie van dit pakket:
from pymatreader import read_mat
-
Gebruik de functie om de matlab-struct te lezen:
data = read_mat('matlab_struct.mat')
-
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'])
. Waardata_opp
de daadwerkelijke sleutel is die de gegevens opslaat. De naam van deze sleutel kan natuurlijk worden gewijzigd tussen verschillende bestanden.
- 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.loadmat
voor v4 (niveau 1.0), v6, v7 tot 7.2 matfiles en h5py.File
voor 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.loadmat
en h5py.File
kunnen 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')