gpt4 book ai didi

python - python读取的复杂Matlab struct mat文件

转载 作者:太空宇宙 更新时间:2023-11-03 15:47:44 24 4
gpt4 key购买 nike

我知道mat文件的版本问题,对应python中不同的加载模块,即scipy.ioh5py。我也搜索了很多类似的问题,比如 scipy.io.loadmat nested structures (i.e. dictionaries)How to preserve Matlab struct when accessing in python? .但是当涉及到更复杂的 mat 文件时,它们都失败了。我的anno_bbox.mat文件结构如下所示:

前两层:

anno_bbox

bbox_test

在尺寸上:

size

在海里:

hoi

在 hoi bboxhuman 中:

bboxhuman

当我使用spio.loadmat('anno_bbox.mat', struct_as_record=False, squeeze_me=True)时,它只能获取第一级信息作为字典。

>>> anno_bbox.keys()
dict_keys(['__header__', '__version__', '__globals__', 'bbox_test',
'bbox_train', 'list_action'])
>>> bbox_test = anno_bbox['bbox_test']
>>> bbox_test.keys()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'keys'
>>> bbox_test
array([<scipy.io.matlab.mio5_params.mat_struct object at 0x7fa8660ab128>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fa8660ab2b0>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fa8660ab710>,
...,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fa8622ec4a8>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fa8622ecb00>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7fa8622f1198>], dtype=object)

我不知道接下来要做什么。这对我来说太复杂了。该文件位于 anno_bbox.mat。 (8.7MB)

最佳答案

我明白了(在这种情况下使用共享文件是个好主意):

加载:

data = io.loadmat('../Downloads/anno_bbox.mat')

我得到:

In [96]: data['bbox_test'].dtype
Out[96]: dtype([('filename', 'O'), ('size', 'O'), ('hoi', 'O')])
In [97]: data['bbox_test'].shape
Out[97]: (1, 9658)

我可以分配 bbox_test=data['bbox_test']。这个变量有9658条记录,有3个字段,每个字段都是object dtype。

所以有一个文件名(一个嵌入在 1 元素数组中的字符串)

In [101]: data['bbox_test'][0,0]['filename']
Out[101]: array(['HICO_test2015_00000001.jpg'], dtype='<U26')

size 有 3 个字段,3 个数字嵌入数组(二维 matlab 矩阵):

In [102]: data['bbox_test'][0,0]['size']
Out[102]:
array([[(array([[640]], dtype=uint16), array([[427]], dtype=uint16), array([[3]], dtype=uint8))]],
dtype=[('width', 'O'), ('height', 'O'), ('depth', 'O')])
In [112]: data['bbox_test'][0,0]['size'][0,0].item()
Out[112]:
(array([[640]], dtype=uint16),
array([[427]], dtype=uint16),
array([[3]], dtype=uint8))

hoi 比较复杂:

In [103]: data['bbox_test'][0,0]['hoi']
Out[103]:
array([[(array([[246]], dtype=uint8), array([[(array([[320]], dtype=uint16), array([[359]], dtype=uint16), array([[306]], dtype=uint16), array([[349]], dtype=uint16)),...
dtype=[('id', 'O'), ('bboxhuman', 'O'), ('bboxobject', 'O'), ('connection', 'O'), ('invis', 'O')])


In [126]: data['bbox_test'][0,1]['hoi']['id']
Out[126]:
array([[array([[132]], dtype=uint8), array([[140]], dtype=uint8),
array([[144]], dtype=uint8)]], dtype=object)
In [130]: data['bbox_test'][0,1]['hoi']['bboxhuman'][0,0]
Out[130]:
array([[(array([[226]], dtype=uint8), array([[340]], dtype=uint16), array([[18]], dtype=uint8), array([[210]], dtype=uint8))]],
dtype=[('x1', 'O'), ('x2', 'O'), ('y1', 'O'), ('y2', 'O')])

因此,您在 MATLAB 结构中显示的数据都在那里,在数组的嵌套结构(通常是 2d (1,1) 形状)、对象数据类型或多个字段中。

返回并使用 squeeze_me 加载我得到一个更简单的:

In [133]: data['bbox_test'][1]['hoi']['bboxhuman']
Out[133]:
array([array((226, 340, 18, 210),
dtype=[('x1', 'O'), ('x2', 'O'), ('y1', 'O'), ('y2', 'O')]),
array((230, 356, 19, 212),
dtype=[('x1', 'O'), ('x2', 'O'), ('y1', 'O'), ('y2', 'O')]),
array((234, 342, 13, 202),
dtype=[('x1', 'O'), ('x2', 'O'), ('y1', 'O'), ('y2', 'O')])],
dtype=object)

使用 struct_as_record='False',我得到

In [136]: data['bbox_test'][1]
Out[136]: <scipy.io.matlab.mio5_params.mat_struct at 0x7f90841e9748>

查看此 rec 的属性,我发现我可以通过属性名称访问“字段”:

In [137]: rec = data['bbox_test'][1]
In [138]: rec.filename
Out[138]: 'HICO_test2015_00000002.jpg'
In [139]: rec.size
Out[139]: <scipy.io.matlab.mio5_params.mat_struct at 0x7f90841e9b38>

In [141]: rec.size.width
Out[141]: 640
In [142]: rec.hoi
Out[142]:
array([<scipy.io.matlab.mio5_params.mat_struct object at 0x7f90841e9be0>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7f90841e9e10>,
<scipy.io.matlab.mio5_params.mat_struct object at 0x7f90841ee0b8>],
dtype=object)

In [145]: rec.hoi[1].bboxhuman
Out[145]: <scipy.io.matlab.mio5_params.mat_struct at 0x7f90841e9f98>
In [146]: rec.hoi[1].bboxhuman.x1
Out[146]: 230

In [147]: vars(rec.hoi[1].bboxhuman)
Out[147]:
{'_fieldnames': ['x1', 'x2', 'y1', 'y2'],
'x1': 230,
'x2': 356,
'y1': 19,
'y2': 212}

等等。

关于python - python读取的复杂Matlab struct mat文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48970785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com