Huda Iftikhar
Huda Iftikhar

Reputation: 35

Extracting .mat files with structs into Python

I am new to python and am facing difficulty in extracting file data. So I have a .mat file which has the following output in Matlab:

d= open('tesla.mat')

d =

struct with fields:

diga: [1×1 struct]

d.diga.daten

ans =

struct with fields:

       Programmdauer: [1×78 double]
              SOCVec: [1×78 double]
            Spannung: [1×78 double]
         SpannungVec: [1×78 double]
               Strom: [1×78 double]
            StromVec: [1×78 double]
       TemperaturVec: [1×78 double]
   ThermischLeistung: [1×78 double]
ThermischLeistungVec: [1×78 double]

d.diga.daten.Spannung

ans =

Columns 1 through 20

4.0544    4.2100    4.2133    4.2149    4.2159    4.2168    4.2175    4.2181    4.2186    4.2191    4.0332    4.0265    4.0247    4.0235    4.0227    4.0223    4.0219    4.0217    4.0215    4.0213

Columns 21 through 40

4.0211    4.0210    4.0208    4.0552    4.0559    4.0561    4.0563    4.0564    4.0564    4.0564    4.0564    4.0564    4.0564    4.0564    4.0563    4.0563    4.0563    4.0563    4.0563    4.0563

Columns 41 through 60

4.0562    4.0562    4.0562    4.0562    4.0562    4.0562    4.0561    4.0561    4.0561    4.0561    4.0561    4.0561    4.0561    4.0561    4.0561    4.0560    4.0560    4.0560    4.0560    4.0560

Columns 61 through 78

4.0560    4.0560    4.0560    4.0560    4.0560    4.0560    4.0559    4.0559    4.0559    4.0559    4.0559    4.0559    4.0559    4.0559    4.0559    4.0559    4.0559    4.0559

I want to parse this data in python and extract this specific variable e.g Spannung data . The output in python is as follows :

{'__header__': b'MATLAB 5.0 MAT-file, Platform: x86_64-pc-linux-gnu, Created by: libmatio v1.5.9 on Mon Jul  6 20:29:51 2020', '__version__': '1.0', '__globals__': [], 'diga': array([[(array([[(array([[0.        , 0.10464944, 0.21018082, 0.31937647, 0.42176473,
    0.53570583, 0.6428233 , 0.74994078, 0.85705826, 0.96417574,
    1.0681423 , 1.17389392, 1.28139943, 1.40048611, 1.52559419,
    1.64743952, 1.76928485, 1.89113018, 2.        , 2.12290829,
    2.24581658, 2.36872488, 2.49163317, 2.59454399, 2.69687044,
    2.81347033, 2.93308651, 3.05714129, 3.17464839, 3.3055228 ,
    3.45267061, 3.58849168, 3.77533445, 3.88176795, 3.998157  ,
    4.19674602, 4.34787781, 4.5       , 4.69631901, 4.83781901,
    4.99708256, 5.20507697, 5.37073747, 5.5       , 5.6080527 ,
    5.78533992, 5.95166902, 6.09878942, 6.28218433, 6.4540618 ,
    6.59066557, 6.69357254, 6.8539116 , 6.95566133, 7.08274939,
    7.19399435, 7.3374617 , 7.44876399, 7.58496883, 7.70381522,
    7.83578215, 7.94780886, 8.08803463, 8.19780798, 8.34935696,
    8.45694731, 8.58460976, 8.69666891, 8.83509531, 8.94704739,
    9.08658847, 9.20783487, 9.33469661, 9.44355668, 9.59016133,
    9.6962619 , 9.85349258, 9.95928693]]), array([[88.3       , 88.30430713, 88.30865056, 88.3131448 , 88.31735886,
    88.32204841, 88.32645712, 88.33086583, 88.33527453, 88.33968324,
    88.34053444, 88.33956722, 88.33858396, 88.33749478, 88.33635052,
    88.3352361 , 88.33412169, 88.33300727, 88.33201153, 88.33088739,
    88.32976326, 88.32863912, 88.32751498, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846, 88.32743846, 88.32743846,
    88.32743846, 88.32743846, 88.32743846]]), array([[4.05436068, 4.21002405, 4.21327229, 4.21486158, 4.21591229,
    4.2168056 , 4.21748722, 4.21807606, 4.21860772, 4.21910362,
    4.03324528, 4.0265357 , 4.02467542, 4.02350034, 4.02273807,
    4.02225604, 4.02191832, 4.02166347, 4.02147603, 4.02129491,
    4.02113115, 4.020979  , 4.02083454, 4.05516985, 4.05587307,
    4.05613862, 4.05627884, 4.05635271, 4.05638517, 4.0563976 ,
    4.0563957 , 4.05638637, 4.05636811, 4.05635644, 4.05634327,
    4.05632056, 4.05630343, 4.05628649, 4.05626516, 4.05625018,
    4.05623371, 4.05621284, 4.0561967 , 4.05618439, 4.0561743 ,
    4.05615809, 4.05614328, 4.05613048, 4.0561149 , 4.05610068,
    4.05608961, 4.05608141, 4.05606887, 4.05606105, 4.05605142,
    4.05604313, 4.05603261, 4.05602458, 4.05601491, 4.0560066 ,
    4.05599751, 4.05598991, 4.05598053, 4.0559733 , 4.05596346,
    4.05595658, 4.05594852, 4.05594153, 4.05593303, 4.05592624,
    4.05591789, 4.05591073, 4.05590333, 4.05589706, 4.05588872,
    4.05588277, 4.05587405, 4.05586825]]), array([[4.05436068, 4.21002405, 4.21327229, 4.21486158, 4.21591229,
    4.2168056 , 4.21748722, 4.21807606, 4.21860772, 4.21910362,
    4.03324528, 4.0265357 , 4.02467542, 4.02350034, 4.02273807,
    4.02225604, 4.02191832, 4.02166347, 4.02147603, 4.02129491,
    4.02113115, 4.020979  , 4.02083454, 4.05516985, 4.05587307,
    4.05613862, 4.05627884, 4.05635271, 4.05638517, 4.0563976 ,
    4.0563957 , 4.05638637, 4.05636811, 4.05635644, 4.05634327,
    4.05632056, 4.05630343, 4.05628649, 4.05626516, 4.05625018,
    4.05623371, 4.05621284, 4.0561967 , 4.05618439, 4.0561743 ,
    4.05615809, 4.05614328, 4.05613048, 4.0561149 , 4.05610068,
    4.05608961, 4.05608141, 4.05606887, 4.05606105, 4.05605142,
    4.05604313, 4.05603261, 4.05602458, 4.05601491, 4.0560066 ,
    4.05599751, 4.05598991, 4.05598053, 4.0559733 , 4.05596346,
    4.05595658, 4.05594852, 4.05594153, 4.05593303, 4.05592624,
    4.05591789, 4.05591073, 4.05590333, 4.05589706, 4.05588872,
    4.05588277, 4.05587405, 4.05586825]]), array([[ 0. ,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5, -1. ,
    -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. ,
    -1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ]]), array([[ 0. ,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5,  4.5, -1. ,
    -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. , -1. ,
    -1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,
     0. ]]), array([[25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25.,
    25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25.,
    25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25.,
    25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25.,
    25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25.,
    25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25., 25.]]), array([[0.00000000e+00, 6.85992309e-01, 7.03449743e-01, 7.10867829e-01,
    7.15615588e-01, 7.19174707e-01, 7.21389575e-01, 7.22912024e-01,
    7.24007563e-01, 7.24847258e-01, 4.45033989e-02, 3.85461248e-02,
    3.58360767e-02, 3.53935152e-02, 3.56460808e-02, 3.59131697e-02,
    3.60769536e-02, 3.61500744e-02, 3.61654153e-02, 3.61491829e-02,
    3.61153062e-02, 3.60739446e-02, 3.60309650e-02, 9.69429070e-04,
    5.35032457e-04, 3.58732548e-04, 2.92579042e-04, 2.64021521e-04,
    2.49466440e-04, 2.38203495e-04, 2.27951943e-04, 2.19594624e-04,
    2.09204995e-04, 2.03745280e-04, 1.98105959e-04, 1.89197221e-04,
    1.82955847e-04, 1.77092643e-04, 1.70083570e-04, 1.65383061e-04,
    1.60410350e-04, 1.54374091e-04, 1.49900760e-04, 1.46597195e-04,
    1.43952210e-04, 1.39825410e-04, 1.36175399e-04, 1.33110819e-04,
    1.29488217e-04, 1.26275854e-04, 1.23838901e-04, 1.22066587e-04,
    1.19407152e-04, 1.17780340e-04, 1.15810875e-04, 1.14141001e-04,
    1.12057839e-04, 1.10493479e-04, 1.08637272e-04, 1.07067274e-04,
    1.05375319e-04, 1.03979386e-04, 1.02281688e-04, 1.00989373e-04,
    9.92555314e-05, 9.80583899e-05, 9.66725802e-05, 9.54858692e-05,
    9.40565860e-05, 9.29290483e-05, 9.15576202e-05, 9.03953350e-05,
    8.92071874e-05, 8.82095618e-05, 8.68967397e-05, 8.59677815e-05,
    8.46224613e-05, 8.37375088e-05]]), array([[0.00000000e+00, 6.85992309e-01, 7.03449743e-01, 7.10867829e-01,
    7.15615588e-01, 7.19174707e-01, 7.21389575e-01, 7.22912024e-01,
    7.24007563e-01, 7.24847258e-01, 4.45033989e-02, 3.85461248e-02,
    3.58360767e-02, 3.53935152e-02, 3.56460808e-02, 3.59131697e-02,
    3.60769536e-02, 3.61500744e-02, 3.61654153e-02, 3.61491829e-02,
    3.61153062e-02, 3.60739446e-02, 3.60309650e-02, 9.69429070e-04,
    5.35032457e-04, 3.58732548e-04, 2.92579042e-04, 2.64021521e-04,
    2.49466440e-04, 2.38203495e-04, 2.27951943e-04, 2.19594624e-04,
    2.09204995e-04, 2.03745280e-04, 1.98105959e-04, 1.89197221e-04,
    1.82955847e-04, 1.77092643e-04, 1.70083570e-04, 1.65383061e-04,
    1.60410350e-04, 1.54374091e-04, 1.49900760e-04, 1.46597195e-04,
    1.43952210e-04, 1.39825410e-04, 1.36175399e-04, 1.33110819e-04,
    1.29488217e-04, 1.26275854e-04, 1.23838901e-04, 1.22066587e-04,
    1.19407152e-04, 1.17780340e-04, 1.15810875e-04, 1.14141001e-04,
    1.12057839e-04, 1.10493479e-04, 1.08637272e-04, 1.07067274e-04,
    1.05375319e-04, 1.03979386e-04, 1.02281688e-04, 1.00989373e-04,
    9.92555314e-05, 9.80583899e-05, 9.66725802e-05, 9.54858692e-05,
    9.40565860e-05, 9.29290483e-05, 9.15576202e-05, 9.03953350e-05,
    8.92071874e-05, 8.82095618e-05, 8.68967397e-05, 8.59677815e-05,
    8.46224613e-05, 8.37375088e-05]]))]],
  dtype=[('Programmdauer', 'O'), ('SOCVec', 'O'), ('Spannung', 'O'), ('SpannungVec', 'O'), ('Strom', 'O'), ('StromVec', 'O'), ('TemperaturVec', 'O'), ('ThermischLeistung', 'O'), ('ThermischLeistungVec', 'O')]),)]],
  dtype=[('daten', 'O')])}

what would be the code to write in python to extract specific array data .

Upvotes: 1

Views: 3425

Answers (2)

BossaNova
BossaNova

Reputation: 1527

OK I'm adding a second answer with a generalized little function that can extract data mat files with any type of fields inside, for people who may need it in the future (and even for myself, I am dealing with this question often and each time I build an ad-hoc solution...).

This function should be able to take in any mat file with structs and nested structs inside, and return a dictionary:

import scipy.io as sio

def load_from_mat(filename=None, data={}, loaded=None):
    if filename:
        vrs = sio.whosmat(filename)
        name = vrs[0][0]
        loaded = sio.loadmat(filename,struct_as_record=True)
        loaded = loaded[name]
    whats_inside = loaded.dtype.fields
    fields = list(whats_inside.keys())
    for field in fields:
        if len(loaded[0,0][field].dtype) > 0: # it's a struct
            data[field] = {}
            data[field] = load_from_mat(data=data[field], loaded=loaded[0,0][field])
        else: # it's a variable
            data[field] = loaded[0,0][field]
    return data

# and then just call the function
my_file = r"C:\Users\.......\data.mat"
data = load_from_mat(filename=my_file) # Don't worry about the other input vars (data, loaded), there are used in the recursion.    

Upvotes: 1

BossaNova
BossaNova

Reputation: 1527

Loading matlab structs into python is a bit of a mess but the scipy.io.loadmat method can do it with a bit of exploration.

See help for scipy.io.loadmat. They explain how it works.

Start by loading the file:

import scipy.io as sio
my_struct = sio.loadmat(file_name)

Then, get the data from the dict:

my_struct.keys() # this will show you the var name of your data, in your case diga (if I understand correctly)
data = my_struct["diga"]

Now, for each level of nested structs you can use .dtype to see the next structs inside and then pull the data:

data.dtype
data[0,0]["daten"]

And then:

data[0,0,]["daten"][0,0]["Spannung"]

** I might have missed a level in your struct, play with it to see if it's not exactly fitting your struct.

Upvotes: 1

Related Questions