使用scipy.io.loadmat将字典键转换为Python中来自.mat Matlab文件的相同值的变量名

J S*_*pen 7 python matlab numpy scipy mat-file

我试图使用scipy.io.loadmat从.mat文件中加载一个基本字典temp = {'key':array([1,2])}.将loadmat()返回的Python字典文件中的键转换为变量名称,其值与表示键相同.

例如:

temp = {'key':array([1,2])}
Run Code Online (Sandbox Code Playgroud)

转换成

key = array([1,2])
Run Code Online (Sandbox Code Playgroud)

我知道如何使用temp.keys()获取密钥.然后抓取项目很简单,但是如何强制temp.keys()中的字符串列表是变量名而不是字符串.

我希望这是有道理的,但这可能很容易,我只是想不出怎么做.

干杯

Céd*_*ien 10

在python中,方法参数可以作为带有**魔法的字典传递:

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

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

my_func(**temp)

>>> array([1,2])
Run Code Online (Sandbox Code Playgroud)


cdh*_*ann 5

最好的办法就是使用temp['key']. 但是,要回答这个问题,您可以使用该exec函数。这样做的好处是,您不必硬编码任何变量名称或将自己限制在函数内工作。

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]])
Run Code Online (Sandbox Code Playgroud)

注意:只有当您从模块导入特定功能时,这才有效。如果由于代码实践或需要导入的函数数量过多而不想这样做,则可以编写一个函数来在条目前面连接模块名称。输出与前面的示例相同。

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)))
Run Code Online (Sandbox Code Playgroud)

虽然这不是最佳的代码实践,但它对于我测试的所有示例都很有效。