Transforme as chaves de dicionário em nomes de variáveis com os mesmos valores em Python dos arquivos .mat Matlab usando scipy.io.loadmat

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

Pergunta

Estou tentando pegar um dicionário básico temp= {'key': array ([1,2])} carregado de um arquivo .mat com scipy.io.loadmat.Transforme as chaves no arquivo de dicionário Python retornado por loadmat () em nomes de variáveis com valores iguais aos das chaves representativas.

Então, por exemplo:

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

transformou-se em

key = array([1,2])

Eu sei como pegar as chaves com temp.keys ().Em seguida, pegar os itens é fácil, mas como faço para forçar a lista de strings em temp.keys () a serem nomes de variáveis em vez de strings.

Espero que faça sentido, mas provavelmente é muito fácil, mas não consigo imaginar como fazer.

Saúde

Foi útil?

Solução

Em python, os parâmetros do método podem ser passados como dicionários com a mágica do **:

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

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

my_func(**temp)

>>> array([1,2])

Outras dicas

A melhor coisa a fazer é usar temp['key'].Para responder à pergunta, no entanto, você pode usar a função exec.Os benefícios de fazer dessa forma são que você pode fazer isso sem precisar codificar nenhum nome de variável ou se limitar a trabalhar dentro de uma função.

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: Isso só funcionará se você importou a função específica dos módulos.Se você não quiser fazer isso por causa da prática do código ou do grande volume de função que você precisa importar, você pode escrever uma função para concatenar o nome do módulo na frente da entrada.O resultado é o mesmo do exemplo 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)))

Embora esta não seja a melhor prática de código, funciona bem para todos os exemplos que testei.

A melhor maneira é colocar os dados em um 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

É tão fácil de usar interativamente e não requer nenhum tipo de mágica. Isso deve ser adequado para usuários do Matlab também.

EDITAR : acontece que as coisas abaixo não funcionam na maioria das vezes.Que pena, chega de mágica.

Se quiser se intrometer na magia, você pode fazer algo como

locals().update(somedict)

Isso funcionará bem interativamente, e você pode até ocultar o acesso a locals() dentro da função do carregador mexendo com sys._getframe().f_back.f_locals.

No entanto, isso não funcionará nas funções:

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

A questão é que a acima é vinculado à variável global em tempo de compilação e, portanto, o Python não tenta procurá-lo entre as variáveis locais.

Embora eu recomende apenas usar o dicionário diretamente e acessar as matrizes como temp['key'], se você conhecesse todos os nomes de variáveis com antecedência, poderia escrever uma função para extraí-los para variáveis individuais:

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top