2012-08-14 7 views
7

ich eine Matte-Datei, die ichWie bewahrt man die Matlab-Struktur beim Zugriff in Python?

from scipy import io 
mat = io.loadmat('example.mat') 

Von Matlab Zugriff über, example.mat die folgende Struktur

>> load example.mat 
    >> data1 

    data1 = 

      LAT: [53x1 double] 
      LON: [53x1 double] 
      TIME: [53x1 double] 
      units: {3x1 cell} 


    >> data2 

    data2 = 

      LAT: [100x1 double] 
      LON: [100x1 double] 
      TIME: [100x1 double] 
      units: {3x1 cell} 

in Matlab enthält, I-Daten so einfach wie data2.LON zugreifen können, etc .. Es ist nicht so trivial in Python. Es gibt mir mehrere Optionen, aber wie

mat.clear  mat.get   mat.iteritems mat.keys  mat.setdefault mat.viewitems 
mat.copy  mat.has_key  mat.iterkeys mat.pop   mat.update  mat.viewkeys  
mat.fromkeys mat.items  mat.itervalues mat.popitem  mat.values  mat.viewvalues  

Ist es möglich, die gleiche Struktur in Python zu erhalten? Wenn nicht, wie kann ich am besten auf die Daten zugreifen? Der vorliegende Python-Code, mit dem ich arbeite, ist sehr schwierig zu handhaben.

Dank

+0

Können Sie erklären, wie es aussieht, wenn Sie es in Python laden? –

+0

Auch ein anderer Gedanke. Wenn Sie SciPi verwenden, haben Sie versucht, 'SciPi.loadmat' zu verwenden? –

+0

ja, ich habe loadmat ausprobiert. Die Ausgabe in Python ist nur schwer zu benutzen. Ich weiß nicht einmal, wie man in entweder data1 oder data2 auf LON oder LAT zugreift. – mikeP

Antwort

6

Fand dieses Tutorial über Matlab Struktur und Python

http://docs.scipy.org/doc/scipy/reference/tutorial/io.html

+0

Dies könnte möglicherweise eine Schicht zusätzlicher Informationen für Sie auch hinzufügen: http://stackoverflow.com/questions/1984714/how-to-access-fields-in-a-struct-imported-from-a-mat -file-using-loadmat-in-pyth: rq = 1 –

0

(!) Bei verschachtelten Strukturen in *.mat Dateien gespeichert ist, dann notwendig, wenn die Elemente im Wörterbuch zu überprüfen, die io.loadmat Ausgänge sind Matlab-Strukturen. Zum Beispiel, wenn in Matlab

>> thisStruct 

ans = 
     var1: [1x1 struct] 
     var2: 3.5 

>> thisStruct.var1 

ans = 
     subvar1: [1x100 double] 
     subvar2: [32x233 double] 

verwenden dann den Code durch Mergen in scipy.io.loadmat nested structures (i.e. dictionaries)

0

Wenn ich in einem Array von structs {strut_1, struct_2} I extrahieren eine Notwendigkeit, Daten in Python von MATLAB zu laden, die gespeichert wird, Liste der Schlüssel und Werte aus dem Objekt, das ich mit scipy.io.loadmat laden. Ich kann diese dann in eigene Variablen zusammenfassen oder bei Bedarf in ein Wörterbuch umpacken. Die Verwendung des Befehls exec ist möglicherweise nicht in allen Fällen angemessen, aber wenn Sie nur versuchen, Daten zu verarbeiten, funktioniert es gut.

# Load the data into Python  
D= sio.loadmat('data.mat') 

# build a list of keys and values for each entry in the structure 
vals = D['results'][0,0] #<-- set the array you want to access. 
keys = D['results'][0,0].dtype.descr 

# Assemble the keys and values into variables with the same name as that used in MATLAB 
for i in range(len(keys)): 
    key = keys[i][0] 
    val = np.squeeze(vals[key][0][0]) # squeeze is used to covert matlat (1,n) arrays into numpy (1,) arrays. 
    exec(key + '=val') 
Verwandte Themen