Verwandeln Sie die Wörterbuchschlüssel mithilfe von scipy.io.loadmat in Python aus .mat Matlab-Dateien in Variablennamen mit denselben Werten

StackOverflow https://stackoverflow.com/questions/6369535

Frage

Ich versuche, ein grundlegendes Wörterbuch zu verwenden. temp= {'key': array ([1,2])}, das aus einer .mat-Datei mit scipy.io.loadmat geladen wurde.Verwandeln Sie die von loadmat () zurückgegebenen Schlüssel in der Python-Wörterbuchdatei in Variablennamen mit Werten, die den darstellenden Schlüsseln entsprechen.

Also zum Beispiel:

temp = {'key':array([1,2])}

wurde zu

key = array([1,2])

Ich weiß, wie man mit temp.keys () die Schlüssel greift.Das Abrufen der Elemente ist dann einfach, aber wie kann ich erzwingen, dass die Liste der Zeichenfolgen in temp.keys () Variablennamen anstelle von Zeichenfolgen sind?

Ich hoffe, das macht Sinn, aber das ist wahrscheinlich sehr einfach. Ich kann mir einfach nicht vorstellen, wie es geht.

Prost

War es hilfreich?

Lösung

In Python können Methodenparameter als Wörterbücher mit der ** magic übergeben werden:

def my_func(key=None):
   print key
   #do the real stuff

temp = {'key':array([1,2])}

my_func(**temp)

>>> array([1,2])

Andere Tipps

Am besten verwenden Sie temp['key'].Um die Frage zu beantworten, können Sie jedoch die exec-Funktion verwenden.Der Vorteil dieser Vorgehensweise besteht darin, dass Sie dazu keine Variablennamen fest codieren oder sich darauf beschränken müssen, innerhalb einer Funktion zu arbeiten.

from numpy import array,matrix

temp = {'key':array([1,2]),'b': 4.3,'c': 'foo','d':matrix([2,2])}

for k in temp:
    exec('{KEY} = {VALUE}'.format(KEY = k, VALUE = repr(temp[k])))

>>> key
array([1, 2])
>>> b
4.3
>>> c
'foo'
>>> d
matrix([[2, 2]])

HINWEIS: Dies funktioniert nur, wenn Sie die spezifische Funktion aus den Modulen importiert haben.Wenn Sie dies aufgrund der Code-Praxis oder des schieren Funktionsvolumens, das Sie importieren müssten, nicht möchten, können Sie eine Funktion schreiben, um den Modulnamen vor dem Eintrag zu verketten.Die Ausgabe ist dieselbe wie im vorherigen Beispiel.

import numpy as np,numpy

temp = {'key':np.array([1,2]),'b': 4.3,'c': 'foo','d':np.matrix([2,2])}

def exec_str(key,mydict):
    s = str(type(mydict[key]))
    if '.' in s:
        start = s.index("'") + 1
        end = s.index(".") + 1
        v = s[start:end:] + repr(mydict[key])
    else:
        v = repr(mydict[key])     
    return v

for k in temp:
    exec('{KEY} = {VALUE}'.format(KEY = k, VALUE = exec_str(k,temp)))

Dies ist zwar nicht die beste Code-Praxis, funktioniert jedoch für alle von mir getesteten Beispiele.

Eine bessere Möglichkeit besteht darin, die Daten in ein separates Objekt zu packen:

class attrdict(dict):
    def __getattr__(self, k): return self[k]
    def __setattr__(self, k, v): self[k] = v

somedict = {'key': 123, 'stuff': 456}

data = attrdict(somedict)
print data.key
print data.stuff

Dies ist ungefähr so einfach interaktiv zu verwenden und erfordert keine Magie. Dies sollte auch für Matlab-Benutzer in Ordnung sein.

BEARBEITEN : Es stellt sich heraus, dass die folgenden Dinge die meiste Zeit nicht funktionieren.Schade, so viel zur Magie.

Wenn Sie sich jedoch in Magie einmischen möchten, können Sie so etwas wie tun

locals().update(somedict)

Dies funktioniert interaktiv einwandfrei, und Sie können den Zugriff auf locals() sogar innerhalb der Loader-Funktion verbergen, indem Sie mit sys._getframe().f_back.f_locals herumspielen.

Dies funktioniert jedoch nicht in folgenden Funktionen:

def foo():
    locals().update({'a': 4})
    print a 

Der Punkt ist, dass der obige a zur Kompilierungszeit an eine globale Variable gebunden ist und Python daher nicht versucht, ihn unter lokalen Variablen nachzuschlagen.

Während ich nur empfehlen würde, das Wörterbuch direkt zu verwenden und auf die Arrays wie temp['key'] zuzugreifen, könnten Sie, wenn Sie alle Variablennamen im Voraus kennen, eine Funktion schreiben, um sie in einzelne Variablen zu extrahieren:

def func(**kwargs):
    return kwargs['a'],kwargs['b']


temp = {'a':np.array([1,2]),'b':np.array([3,4])}
a,b = func(**temp)
del temp # get rid of temporary dict

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top