使用 scipy.io.loadmat 将 .mat Matlab 文件中的字典键转换为 Python 中具有相同值的变量名
我正在尝试使用 scipy.io.loadmat 从 .mat 文件加载基本字典 temp = {'key':array([1,2])} 。将 loadmat() 返回的 Python 字典文件中的键转换为变量名,其值与代表键相同。
例如:
temp = {'key':array([1,2])}
变成
key = array([1,2])
我知道如何用 temp.keys() 获取钥匙。然后抓取项目很容易,但如何强制 temp.keys() 中的字符串列表为变量名而不是字符串。
我希望这是有道理的,但这可能真的很容易,我只是不知道该怎么做。
干杯
I am trying to take a basic dictionary temp = {'key':array([1,2])} loaded from a .mat file with scipy.io.loadmat. Turn the keys in the Python dictionary file returned by loadmat() into variable names with values the same as the representing keys.
So for example:
temp = {'key':array([1,2])}
turned into
key = array([1,2])
I know how to grab the keys with temp.keys(). Then grabbing the items is easy but how do I force the list of strings in temp.keys() to be variable names instead of strings.
I hope this makes sense but this is probably really easy I just can't think how to do it.
Cheers
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
在 python 中,方法参数可以使用
**
魔法作为字典传递:In python, method parameters can be passed as dictionnaries with the
**
magic:最好的办法是使用
temp['key']
。但是,要回答这个问题,您可以使用exec
函数。这样做的好处是,您不必硬编码任何变量名或将自己限制在函数内工作。注意:仅当您从模块导入特定功能时,此操作才有效。如果由于代码实践或需要导入的函数数量过多而不想这样做,则可以编写一个函数来在条目前面连接模块名称。输出与前面的示例相同。
虽然这不是最佳的代码实践,但它对于我测试的所有示例都很有效。
The best thing to do is to use
temp['key']
. To answer the question, however, you could use theexec
function. The benefits of doing it this way is that you can do this don't have to hard code any variable names or confine yourself to work inside a function.NOTE : This will only work if you have imported the specific function from the modules. If you don't want to do this because of code practice or the sheer volume of function that you would need to import, you could write a function to concatenate the module name in front of the entry. Output is the same as the previous example.
While this isn't the best code practice, It works well for all of the examples I tested.
更好的方法可能是将数据填充到一个单独的对象中:
这很容易交互使用,并且不需要任何魔法。
这对于 Matlab 用户来说也应该没问题。
编辑:事实证明,下面的内容在大多数情况下实际上不起作用。太糟糕了,魔法就这么多了。
不过,如果您想使用魔法,您可以执行类似这样的操作,
这将可以交互地正常工作,您甚至可以通过弄乱
sys 来隐藏对加载器函数内的
。locals()
的访问._getframe().f_back.f_locals然而,这在函数中不起作用:
重点是上面的
a
在编译时绑定到全局变量,因此 Python 不会尝试在局部变量中查找它。A better way may be to stuff the data to a separate object:
This is about as easy to use interactively, and does not require any magic.
This should be OK for Matlab-users, too.
EDIT: turns out the stuff below doesn't actually work most of the time. Too bad, so much for magic.
If you want to meddle with magic, though, you can do something like
This will work fine interactively, and you can even hide the access to
locals()
inside the loader function by messing withsys._getframe().f_back.f_locals
.However, this will not work in functions:
The point is that
a
above is bound to global variable at compile time, and so Python does not try looking it up in among local variables.正如 hdhagman 回答的那样,使用 exec() 更简单。我写了更简单的代码。
temp = {'key':[1,2]}
print(key)
=> [1,2]
To use exec() is more simple as hdhagman answered. I write more simple code.
temp = {'key':[1,2]}
print(key)
=> [1,2]
对于 numpy 数组和其他非内置类型,上面的答案都不适合我。但是,执行了以下操作:
注意引号的顺序。这使得
var
在第一个实例中被视为变量,然后在第二个实例中被视为键,索引到temp
字典中。当然,关于 exec() 和 eval() 危险的常见免责声明仍然适用,并且您应该仅在您绝对信任的输入上运行此命令。
None of the answers above worked for me with numpy arrays and other non-built-in types. However, the following did:
Note the order of the quotes. This allows
var
to be treated as a variable in the first instance, and then as a key in the second instance, indexing into thetemp
dictionary.Of course, the usual disclaimers about the dangers of
exec()
andeval()
still apply, and you should only run this on input you absolutely trust.虽然我建议直接使用字典并访问诸如 temp['key'] 之类的数组,但如果您提前知道所有变量名称,您可以编写一个函数将它们提取到各个变量:
While I would just recommend using the dictionary directly and accessing the arrays like
temp['key']
, if you knew all of the variable names ahead of time you could write a function to extract them to individual variables:我有同样的问题,我根据其他人的答案尝试了这个代码。在这里,我使用 pickle 而不是 Matlab 来存储和检索数据。
I had the same question and I tried this code based on the other's answers. Here I used pickle instead of Matlab to store and retrieve the data.