Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将.mat二进制格式转换为2D numpy数组?_Python_Numpy_Mat File - Fatal编程技术网

Python 如何将.mat二进制格式转换为2D numpy数组?

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]]),

我正在将注释转换成一种我可以在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]]), 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使用to
tolist()
的想法可能是提取这些嵌套对象字段的最干净的方法:

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使用to
tolist()
的想法可能是提取这些嵌套对象字段的最干净的方法:

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格式的论坛上迷路了,谢谢。