Konvertieren einer Matlabcell in Python

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Hallo,
ich habe Datensätze im .mat Format bekommen. Nun versuche ich die zu Plotten.

Code: Alles auswählen

import numpy as np

# Import the scipy.io
import scipy.io
# load .mat file into dictionary x
x = scipy.io.loadmat('/home/samothkociok/Desktop/Algerien.mat')

print(type(x))
print(x.keys())
Out: <class 'dict'>
dict_keys(['__version__', '__function_workspace__', '__globals__', '__header__', 'Datensatz'])

Nun ist das ein sehr verschachtelter File:
{'Datensatz': array([[ MatlabOpaque([(b'', b'MCOS', b'string', [[3707764736], [2], [1], [1], [1], [1]])],
dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')]),
MatlabOpaque([(b'', b'MCOS', b'datetime', [[3707764736], [2], [1], [1], [34], [2]])],
dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')]),
array([[ 0.00000000e+00, 0.00000000e+00, 8.00000000e+03, ...,
nan, nan, nan],
[ 0.00000000e+00, 0.00000000e+00, 8.00000000e+03, ...,
5.00000000e-01, 2.43839992e+03, nan],
[ 0.00000000e+00, 0.00000000e+00, 8.00000000e+03, ...,
5.00000000e-01, 1.00583997e+03, nan],
...,
[ 6.00000000e+01, 1.02888800e+00, 9.99900000e+03, ...,
7.50000000e-01, 3.04799990e+03, nan],
[ 6.00000000e+01, 1.02888800e+00, 9.99900000e+03, ...,
7.50000000e-01, 3.04799990e+03, nan],
[ 8.00000000e+01, 1.02888800e+00, 9.99900000e+03, ...,
7.50000000e-01, 3.04799990e+03, nan]])],
[ MatlabOpaque([(b'', b'MCOS', b'string', [[3707764736], [2], [1], [1], [2], [1]])],
dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')]),
MatlabOpaque([(b'', b'MCOS', b'datetime', [[3707764736], [2], [1], [1], [35], [2]])],
dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')]),
array([[ 2.50000000e+02, 5.65888400e+00, 9.99900000e+03, ...,
5.00000000e-01, 2.74319991e+03, nan],
[ 2.50000000e+02, 4.62999600e+00, 9.99900000e+03, ...,
5.00000000e-01, 2.74319991e+03, nan],
[ 2.60000000e+02, 5.14444000e+00, 9.99900000e+03, ...,
2.50000000e-01, 7.01039978e+02, nan],
....
....
....
'__function_workspace__': array([[ 0, 1, 73, ..., 0, 0, 0]], dtype=uint8),
'__globals__': [],
'__header__': b'MATLAB 5.0 MAT-file, Platform: PCWIN64, Created on: Wed Feb 7 10:47:40 2018',
'__version__': '1.0'}

Wenn ich das richtig sehe ist das eine 33x3 Cell in der in der Ersten Spalte Buchstaben stehen und in den Spalten 2 und 3 jeweils eine weitere Cell mit verschiedenen einträgen...

Nun möchte ich z.B. von der ersten Zeile
1 2 3
"DAAD" 4053x1 datetime 4053x9 double
Die datetime über eine Zeile der 3. SPalte (4053x9 double) plotten in der verschiedene Größen abgespeichert sind plotten (x.plot(Zeit, Messwert))

Wie kann ich das realisieren?

Gruß
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Samoth: am Besten hangelst Du Dich mit der interaktiven Konsole durch die Struktur, bis Du die gewünschten Werte hast. Wie man die Struktur analysieren kann, hast Du ja schon in Deinem Programm: per type, .keys(), bzw. bei Numpy-Arrays per shape und dtype.
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Hallo,
danke für die Antwort. Mich interessiert wie ich zum Beispiel auf ein Indize des Matrixelemtes komme.
Im Matlab ist es ja:
indize{1,3}[n,m]

Gruß
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@Samoth: in Python wird immer über [..] auf Elemente zugegriffen.
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Hallo,
ja stand da auf dem Schlach, da der zurückgegebene Type der Variabel Type'0' ist. Das heißt Scipy kommt damit nicht zurecht:

Code: Alles auswählen

In [27]: datas[0,1]
Out[27]: 
MatlabOpaque([(b'', b'MCOS', b'datetime', [[3707764736], [2], [1], [1], [34], [2]])], 
      dtype=[('s0', 'O'), ('s1', 'O'), ('s2', 'O'), ('arr', 'O')])
Deswegen die Frage.
Gibt es dafür eine Lösung die Daten in ein pythonfreundliches Format zu konvertieren?

Gruß
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Schau Dir die Optionen von `scipy.io.loadmat` an.
Samoth
User
Beiträge: 41
Registriert: Freitag 24. November 2017, 15:13

Genau da liegt das Problem.

Eingelesen ist es mit hilfe von scipy.io.loadmat.

So wie es scheint kann er den die Matlab datetime nicht einlesen.

Gruß
Antworten