scipy.io.loadmat 嵌套结构(即字典)
使用给定的例程(如何使用 scipy 加载 Matlab .mat 文件),我无法访问更深的嵌套结构以将它们恢复到字典中
为了更详细地介绍我遇到的问题,我给出了以下玩具示例:
load scipy.io as spio
a = {'b':{'c':{'d': 3}}}
# my dictionary: a['b']['c']['d'] = 3
spio.savemat('xy.mat',a)
现在我想将 mat 文件读回到 python 中。我尝试了以下操作:
vig=spio.loadmat('xy.mat',squeeze_me=True)
如果我现在想访问我得到的字段:
>> vig['b']
array(((array(3),),), dtype=[('c', '|O8')])
>> vig['b']['c']
array(array((3,), dtype=[('d', '|O8')]), dtype=object)
>> vig['b']['c']['d']
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/<ipython console> in <module>()
ValueError: field named d not found.
但是,通过使用选项 struct_as_record=False
可以访问该字段:
v=spio.loadmat('xy.mat',squeeze_me=True,struct_as_record=False)
现在可以通过以下方式访问它:
>> v['b'].c.d
array(3)
Using the given routines (how to load Matlab .mat files with scipy), I could not access deeper nested structures to recover them into dictionaries
To present the problem I run into in more detail, I give the following toy example:
load scipy.io as spio
a = {'b':{'c':{'d': 3}}}
# my dictionary: a['b']['c']['d'] = 3
spio.savemat('xy.mat',a)
Now I want to read the mat-File back into python. I tried the following:
vig=spio.loadmat('xy.mat',squeeze_me=True)
If I now want to access the fields I get:
>> vig['b']
array(((array(3),),), dtype=[('c', '|O8')])
>> vig['b']['c']
array(array((3,), dtype=[('d', '|O8')]), dtype=object)
>> vig['b']['c']['d']
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
/<ipython console> in <module>()
ValueError: field named d not found.
However, by using the option struct_as_record=False
the field could be accessed:
v=spio.loadmat('xy.mat',squeeze_me=True,struct_as_record=False)
Now it was possible to access it by
>> v['b'].c.d
array(3)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
以下是重建字典的函数,只需使用此 loadmat 而不是 scipy.io 的 loadmat:
Here are the functions, which reconstructs the dictionaries just use this loadmat instead of scipy.io's loadmat:
只是对合并答案的增强,不幸的是,如果它到达对象的元胞数组,它将停止递归。以下版本将改为创建它们的列表,并在可能的情况下继续递归到元胞数组元素中。
Just an enhancement to mergen's answer, which unfortunately will stop recursing if it reaches a cell array of objects. The following version will make lists of them instead, and continuing the recursion into the cell array elements if possible.
自 scipy >= 1.5.0< /a> 此功能现在使用
simplify_cells
参数内置。As of scipy >= 1.5.0 this functionality now comes built-in using the
simplify_cells
argument.我在 scipy 邮件列表上得到了建议 (https://mail.python.org/pipermail/ scipy-user/)表明还有两种方法可以访问此数据。
这有效:
在我的机器上输出:
3
这种访问的原因:“由于历史原因,在Matlab中,一切都至少是一个二维数组,甚至是标量。”
因此 scipy.io.loadmat 默认情况下模仿 Matlab 行为。
I was advised on the scipy mailing list (https://mail.python.org/pipermail/scipy-user/) that there are two more ways to access this data.
This works:
Output on my machine:
3
The reason for this kind of access: "For historic reasons, in Matlab everything is at least a 2D array, even scalars."
So scipy.io.loadmat mimics Matlab behavior per default.
找到了一种解决方案,可以通过以下方式访问“scipy.io.matlab.mio5_params.mat_struct 对象”的内容:
Found a solution, one can access the content of the "scipy.io.matlab.mio5_params.mat_struct object" can be investigated via:
另一种有效的方法:
输出:
3
我也在 scipy 邮件列表上学到了这个方法。我当然不明白(还)为什么必须添加 '.item()' ,并且:
会抛出错误:
IndexError: only integers, slices (
:
), ellipsis (< code>...)、numpy.newaxis (None
) 和整数或布尔数组是有效索引,但当我知道时我会回来补充解释。 numpy.ndarray.item 的解释(来自 thenumpy 参考):
将数组的元素复制到标准 Python 标量并返回它。
(请注意,这个答案与 hpaulj 对最初问题的评论基本相同,但我觉得该评论不够“可见”或不够理解。当我为第一个问题搜索解决方案时,我当然没有注意到它时间,几周前)。
Another method that works:
Output:
3
I learned this method on the scipy mailing list, too. I certainly don't understand (yet) why '.item()' has to be added in, and:
will throw an error instead:
IndexError: only integers, slices (
:
), ellipsis (...
), numpy.newaxis (None
) and integer or boolean arrays are valid indicesbut I'll be back to supplement the explanation when I know it. Explanation of numpy.ndarray.item (from thenumpy reference):
Copy an element of an array to a standard Python scalar and return it.
(Please notice that this answer is basically the same as the comment of hpaulj to the initial question, but I felt that the comment is not 'visible' or understandable enough. I certainly did not notice it when I searched for a solution for the first time, some weeks ago).