Konvertieren einer Matlabcell in Python

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

Konvertieren einer Matlabcell in Python

Beitragvon Samoth » Donnerstag 8. Februar 2018, 12:46

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: 7044
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Konvertieren einer Matlabcell in Python

Beitragvon Sirius3 » Donnerstag 8. Februar 2018, 13:10

@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: 19
Registriert: Freitag 24. November 2017, 15:13

Re: Konvertieren einer Matlabcell in Python

Beitragvon Samoth » Donnerstag 8. Februar 2018, 14:24

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: 7044
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Konvertieren einer Matlabcell in Python

Beitragvon Sirius3 » Donnerstag 8. Februar 2018, 16:11

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

Re: Konvertieren einer Matlabcell in Python

Beitragvon Samoth » Freitag 9. Februar 2018, 10:31

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: 7044
Registriert: Sonntag 21. Oktober 2012, 17:20

Re: Konvertieren einer Matlabcell in Python

Beitragvon Sirius3 » Freitag 9. Februar 2018, 13:15

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

Re: Konvertieren einer Matlabcell in Python

Beitragvon Samoth » Dienstag 13. Februar 2018, 15:20

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ß

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder