Python 如何将.mat二进制格式转换为2D numpy数组?
我正在将注释转换成一种我可以在YOLOv3中使用的格式。注释是.mat二进制格式的,我想在.csv中提取、转换和重新组织注释 我试过Python 如何将.mat二进制格式转换为2D numpy数组?,python,numpy,mat-file,Python,Numpy,Mat File,我正在将注释转换成一种我可以在YOLOv3中使用的格式。注释是.mat二进制格式的,我想在.csv中提取、转换和重新组织注释 我试过mat=scipy.io.loadmat(file),但提取数据的格式很奇怪 mat=scipy.io.loadmat(文件) bboxes=np.转置(mat['box']) 给出输出: [[array([[(array([[488.42954942, 345.62261032]]), array([[461.57045058, 348.37738968]]),
mat=scipy.io.loadmat(file)
,但提取数据的格式很奇怪
mat=scipy.io.loadmat(文件)
bboxes=np.转置(mat['box'])
给出输出:
[[array([[(array([[488.42954942, 345.62261032]]), array([[461.57045058, 348.37738968]]), array([[465.57045058, 387.37738968]]), array([[492.42954942, 384.62261032]]))]],
dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O')])]
其中形状为(2,1)
和numpy.array类型
我能够提取遍历整个数据集注释的点,如下所示:
points=np.array([point[0]表示bboxes[0][0][0][0]])
其中层次结构是:
print(bboxes[0])
print(bboxes[0][0])
print(bboxes[0][0][0])
print(bboxes[0][0][0][0])
print(bboxes[0][0][0][0][0])
print(bboxes[0][0][0][0][0][0][1])
有没有“更好”的方法来提取所需的点
给定打印的输出:
[[(array([[488.42954942, 345.62261032]]), array([[461.57045058, 348.37738968]]), array([[465.57045058, 387.37738968]]), array([[492.42954942, 384.62261032]]))]]
[(array([[488.42954942, 345.62261032]]), array([[461.57045058, 348.37738968]]), array([[465.57045058, 387.37738968]]), array([[492.42954942, 384.62261032]]))]
(array([[488.42954942, 345.62261032]]), array([[461.57045058, 348.37738968]]), array([[465.57045058, 387.37738968]]), array([[492.42954942, 384.62261032]]))
[[488.42954942 345.62261032]]
345.6226103157693
任何帮助都将不胜感激!谢谢 这会产生更好的结果:
np.concatenate(bboxes[0][0].tolist()).squeeze()
这将产生更好的结果:
np.concatenate(bboxes[0][0].tolist()).squeeze()
我想我可以用
In [38]: array=np.array
In [43]: data = np.zeros((1,1),object)
In [44]: data[0,0] = array([[(array([[488.42954942, 345.62261032]]), array([[461
...: .57045058, 348.37738968]]), array([[465.57045058, 387.37738968]]), arra
...: y([[492.42954942, 384.62261032]]))]],
...: dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O')])
In [45]: data
Out[45]:
array([[array([[(array([[488.42954942, 345.62261032]]), array([[461.57045058, 348.37738968]]), array([[465.57045058, 387.37738968]]), array([[492.42954942, 384.62261032]]))]],
dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O')])]],
dtype=object)
这是一个(1,1)对象数据类型数组,其中包含另一个数组。该数组也是(1,1)形状,但具有复合数据类型(一个结构化的数组)
在MATLAB中,一切都是二维的loadmat
有一个挤压
参数,可以告诉它删除不必要的尺寸。如果没有这些,我们会得到很多(1,1)形状的数组
像cell
和struct
这样的MATLAB对象作为某种类型的对象数据类型数组返回。常规MATLAB矩阵返回一个数值numpy
数组
我们可以使用2d索引从数据中提取一个元素(比数据[0][0]
更惯用):
item()
还可以从数组中删除一个项:
In [54]: data.item().dtype
Out[54]: dtype([('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O')])
在这个级别上,数组是一个结构化数组,有4个(命名)字段,每个字段都是对象数据类型
字段(通常)按名称编制索引。但作为对象数据类型,我们还有另一层:
In [74]: data1['a']
Out[74]: array([[array([[488.42954942, 345.62261032]])]], dtype=object)
In [75]: data1['a'].item()
Out[75]: array([[488.42954942, 345.62261032]])
In [76]: data1['a'].item().squeeze()
Out[76]: array([488.42954942, 345.62261032])
@aparpara使用totolist()
的想法可能是提取这些嵌套对象字段的最干净的方法:
In [85]: data1.tolist()
Out[85]:
[[(array([[488.42954942, 345.62261032]]),
array([[461.57045058, 348.37738968]]),
array([[465.57045058, 387.37738968]]),
array([[492.42954942, 384.62261032]]))]]
在结构化数组tolist()
上创建一个元组列表(或嵌套列表),每个数组“记录”一个元组
然后我们可以使用np.array
或concatenate
将数组合并为一个数组,并使用挤压
删除多余的维度:
In [87]: np.array(data1.tolist()).squeeze()
Out[87]:
array([[488.42954942, 345.62261032],
[461.57045058, 348.37738968],
[465.57045058, 387.37738968],
[492.42954942, 384.62261032]])
MATLAB源代码不是一个简单的2d数值矩阵。因此,翻译成另一种语言也不会很简单。一些loadmat
参数可以简化返回结构。除此之外,我们还必须通过项
或[0,0]
类索引,逐步深入到各个层。我想我可以用
In [38]: array=np.array
In [43]: data = np.zeros((1,1),object)
In [44]: data[0,0] = array([[(array([[488.42954942, 345.62261032]]), array([[461
...: .57045058, 348.37738968]]), array([[465.57045058, 387.37738968]]), arra
...: y([[492.42954942, 384.62261032]]))]],
...: dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O')])
In [45]: data
Out[45]:
array([[array([[(array([[488.42954942, 345.62261032]]), array([[461.57045058, 348.37738968]]), array([[465.57045058, 387.37738968]]), array([[492.42954942, 384.62261032]]))]],
dtype=[('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O')])]],
dtype=object)
这是一个(1,1)对象数据类型数组,其中包含另一个数组。该数组也是(1,1)形状,但具有复合数据类型(一个结构化的数组)
在MATLAB中,一切都是二维的loadmat
有一个挤压
参数,可以告诉它删除不必要的尺寸。如果没有这些,我们会得到很多(1,1)形状的数组
像cell
和struct
这样的MATLAB对象作为某种类型的对象数据类型数组返回。常规MATLAB矩阵返回一个数值numpy
数组
我们可以使用2d索引从数据中提取一个元素(比数据[0][0]
更惯用):
item()
还可以从数组中删除一个项:
In [54]: data.item().dtype
Out[54]: dtype([('a', 'O'), ('b', 'O'), ('c', 'O'), ('d', 'O')])
在这个级别上,数组是一个结构化数组,有4个(命名)字段,每个字段都是对象数据类型
字段(通常)按名称编制索引。但作为对象数据类型,我们还有另一层:
In [74]: data1['a']
Out[74]: array([[array([[488.42954942, 345.62261032]])]], dtype=object)
In [75]: data1['a'].item()
Out[75]: array([[488.42954942, 345.62261032]])
In [76]: data1['a'].item().squeeze()
Out[76]: array([488.42954942, 345.62261032])
@aparpara使用totolist()
的想法可能是提取这些嵌套对象字段的最干净的方法:
In [85]: data1.tolist()
Out[85]:
[[(array([[488.42954942, 345.62261032]]),
array([[461.57045058, 348.37738968]]),
array([[465.57045058, 387.37738968]]),
array([[492.42954942, 384.62261032]]))]]
在结构化数组tolist()
上创建一个元组列表(或嵌套列表),每个数组“记录”一个元组
然后我们可以使用np.array
或concatenate
将数组合并为一个数组,并使用挤压
删除多余的维度:
In [87]: np.array(data1.tolist()).squeeze()
Out[87]:
array([[488.42954942, 345.62261032],
[461.57045058, 348.37738968],
[465.57045058, 387.37738968],
[492.42954942, 384.62261032]])
MATLAB源代码不是一个简单的2d数值矩阵。因此,翻译成另一种语言也不会很简单。一些loadmat
参数可以简化返回结构。除此之外,我们还必须通过项
或[0,0]
类索引,层层深入。有一个压缩
参数。有一个压缩
参数。非常感谢,我一直在寻找这样的答案!刚刚在其他一些MATLAB格式的论坛上迷路了,谢谢。非常感谢,我一直在寻找这样的答案!刚刚在其他一些MATLAB格式的论坛上迷路了,谢谢。