我正在尝试使用scipy的.mat
从io.loadmat()
文件加载一些数据。该函数基本上返回一个包含文件中所有数据的字典。如果我只想从数据文件中获取一个值,我可以执行val_a = io.loadmat(filename)['val_a']
之类的操作。但现在我想取出2个值。我还能用一个命令实现这个目标吗?或者我是否必须首先将字典分配给变量,然后逐个获取这两个值?
像
raw_data = io.loadmat(filename)
val_a = raw_data['val_a']
val_b = raw_data['val_b']
但我要找的是像
val_a, val_b = io.loadmat(filename)['val_a', 'val_b']
通过这样做,我希望避免文件中不必要的数据占用我的记忆。
答案 0 :(得分:8)
你说
通过这样做,我希望避免占用我记忆的文件中不必要的数据
如果您的目标是避免阅读您不感兴趣的文件部分,请告诉SciPy不要通过提供variable_names
argument说明哪些部分来阅读这些部分:
raw_data = scipy.io.loadmat(filename, variable_names=['val_a', 'val_b'])
val_a = raw_data['val_a']
val_b = raw_data['val_b']
在不使用variable_names
的情况下,您可以做的最好的事情就是在提取出您感兴趣的部分后摆脱对dict的引用,并让Python回收内存:
raw_data = scipy.io.loadmat(filename)
val_a = raw_data['val_a']
val_b = raw_data['val_b']
del raw_data
没有语法可以一次从dict中提取两个值。
答案 1 :(得分:1)
在Python 3.x中,您可以在列表理解下方使用以下内容实现此目的:
my_keys = ['val_a', 'val_b'] # List of keys you want to fetch
val_a, val_b = [my_dict[key] for my_dict in [io.loadmat(filename)] for key in my_keys]
# wrapped `dict` inside `list` in order to allow your ^
# dict available within the *list comorehension*
示例示例:
>>> my_keys = ['a', 'b']
>>> [my_dict[key] for my_dict in [{'a': 1, 'b': 2, 'c': 3, 'd':4}] for key in my_keys]
[1, 2] # returned values corresponding to 'a' , 'b'
# `my_dict` can't be referenced outside the scope
>>> my_dict
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'my_dict' is not defined
PS:上面的代码也会在Python 2.x上执行,但是列表解析中定义的变量会有内存泄漏。这意味着,在消耗内存的列表理解之外,将提供对my_dict
的引用。