Seite 1 von 1

Konvertieren einer Matlabcell in Python

Verfasst: Donnerstag 8. Februar 2018, 12:46
von Samoth
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ß

Re: Konvertieren einer Matlabcell in Python

Verfasst: Donnerstag 8. Februar 2018, 13:10
von Sirius3
@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.

Re: Konvertieren einer Matlabcell in Python

Verfasst: Donnerstag 8. Februar 2018, 14:24
von Samoth
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ß

Re: Konvertieren einer Matlabcell in Python

Verfasst: Donnerstag 8. Februar 2018, 16:11
von Sirius3
@Samoth: in Python wird immer über [..] auf Elemente zugegriffen.

Re: Konvertieren einer Matlabcell in Python

Verfasst: Freitag 9. Februar 2018, 10:31
von Samoth
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ß

Re: Konvertieren einer Matlabcell in Python

Verfasst: Freitag 9. Februar 2018, 13:15
von Sirius3
Schau Dir die Optionen von `scipy.io.loadmat` an.

Re: Konvertieren einer Matlabcell in Python

Verfasst: Dienstag 13. Februar 2018, 15:20
von Samoth
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ß