Convierta las claves del diccionario en nombres de variables con los mismos valores en Python desde archivos .mat Matlab usando scipy.io.loadmat

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

Pregunta

Estoy tratando de tomar un diccionario básico temp= {'key': array ([1,2])} cargado desde un archivo .mat con scipy.io.loadmat.Convierta las claves en el archivo de diccionario de Python devuelto por loadmat () en nombres de variable con valores iguales a las claves representativas.

Por ejemplo:

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

convertido en

key = array([1,2])

Sé cómo agarrar las teclas con temp.keys ().Luego, tomar los elementos es fácil, pero ¿cómo puedo forzar la lista de cadenas en temp.keys () para que sean nombres de variables en lugar de cadenas?

Espero que esto tenga sentido, pero probablemente sea muy fácil. No sé cómo hacerlo.

Saludos

¿Fue útil?

Solución

En Python, los parámetros del método se pueden pasar como diccionarios 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])

Otros consejos

Lo mejor que puede hacer es utilizar temp['key'].Sin embargo, para responder a la pregunta, puede utilizar la función exec.Los beneficios de hacerlo de esta manera es que puede hacer esto sin tener que codificar ningún nombre de variable ni limitarse a trabajar dentro de una función.

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: Esto solo funcionará si ha importado la función específica de los módulos.Si no desea hacer esto debido a la práctica del código o al gran volumen de funciones que necesitaría importar, puede escribir una función para concatenar el nombre del módulo delante de la entrada.La salida es la misma que en el ejemplo anterior.

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

Si bien esta no es la mejor práctica de código, funciona bien para todos los ejemplos que probé.

Una mejor manera puede ser almacenar los datos en un objeto separado:

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

Esto es tan fácil de usar de forma interactiva y no requiere ningún tipo de magia. Esto también debería estar bien para los usuarios de Matlab.

EDITAR : resulta que lo siguiente no funciona la mayor parte del tiempo.Lástima, tanto por la magia.

Sin embargo, si quieres entrometerte con la magia, puedes hacer algo como

locals().update(somedict)

Esto funcionará bien de forma interactiva, e incluso puede ocultar el acceso a locals() dentro de la función de cargador jugando con sys._getframe().f_back.f_locals.

Sin embargo, esto no funcionará en funciones:

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

El punto es que a anterior está vinculado a la variable global en tiempo de compilación, por lo que Python no intenta buscarlo entre las variables locales.

Si bien solo recomendaría usar el diccionario directamente y acceder a las matrices como temp['key'], si supiera todos los nombres de las variables antes de tiempo, podría escribir una función para extraerlos a variables individuales:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top