Trasforma le chiavi del dizionario in nomi di variabili con gli stessi valori in Python dai file .mat Matlab usando scipy.io.loadmat

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

Domanda

Sto cercando di prendere un dizionario di base temp= {'key': array ([1,2])} caricato da un file .mat con scipy.io.loadmat.Trasforma le chiavi nel file del dizionario Python restituito da loadmat () in nomi di variabili con valori uguali alle chiavi che rappresentano.

Quindi, ad esempio:

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

trasformato in

key = array([1,2])

So come afferrare le chiavi con temp.keys ().Quindi afferrare gli elementi è facile, ma come faccio a forzare l'elenco di stringhe in temp.keys () come nomi di variabili invece che stringhe.

Spero che abbia senso, ma probabilmente è davvero facile, non riesco a pensare a come farlo.

Saluti

È stato utile?

Soluzione

In python, i parametri del metodo possono essere passati come dizionari con la magia **:

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

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

my_func(**temp)

>>> array([1,2])

Altri suggerimenti

La cosa migliore da fare è utilizzare temp['key'].Per rispondere alla domanda, tuttavia, è possibile utilizzare la funzione exec.Il vantaggio di farlo in questo modo è che puoi farlo senza dover codificare alcun nome di variabile o limitarti a lavorare all'interno di una funzione.

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]])

NOTA: questo funzionerà solo se hai importato la funzione specifica dai moduli.Se non vuoi farlo a causa della pratica del codice o dell'enorme volume di funzioni che dovresti importare, potresti scrivere una funzione per concatenare il nome del modulo davanti alla voce.L'output è lo stesso dell'esempio precedente.

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)))

Sebbene questa non sia la migliore pratica per il codice, funziona bene per tutti gli esempi che ho testato.

Un modo migliore potrebbe essere inserire i dati in un oggetto separato:

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

È facile da usare in modo interattivo e non richiede alcuna magia. Questo dovrebbe andare bene anche per gli utenti Matlab.

MODIFICA : risulta che le cose seguenti in realtà non funzionano la maggior parte delle volte.Peccato, tanto per la magia.

Se vuoi immischiarti nella magia, però, puoi fare qualcosa di simile

locals().update(somedict)

Funzionerà bene in modo interattivo e puoi persino nascondere l'accesso a locals() all'interno della funzione loader scherzando con sys._getframe().f_back.f_locals.

Tuttavia, questo non funzionerà nelle funzioni:

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

Il punto è che a sopra è vincolato alla variabile globale in fase di compilazione, quindi Python non prova a cercarlo tra le variabili locali.

Anche se consiglierei di usare direttamente il dizionario e di accedere agli array come temp['key'], se conoscessi tutti i nomi delle variabili in anticipo potresti scrivere una funzione per estrarli in singole variabili:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top