【问题标题】:How to save a list of python dictionaries as an array of matlab structured arrays?如何将python字典列表保存为matlab结构化数组的数组?
【发布时间】:2019-02-08 18:28:27
【问题描述】:

我正在尝试创建一个要在 matlab 环境中读取的文件。 matlab中的结构是这样的

trx(1) = 
          x: [1×1500 double]
          y: [1×1500 double]
          a: [1×1500 double]
          b: [1×1500 double]
      theta: [1×1500 double]
 firstframe: 1
   endframe: 1500
    nframes: 1500
        off: 0 


 trx(2) = 
          x: [1×751 double]
          y: [1×751 double]
          a: [1×751 double]
          b: [1×751 double]
      theta: [1×751 double]
 firstframe: 750
   endframe: 1500
    nframes: 751
        off: -749 

所以很自然地,我创建了一个包含必填字段的 python 字典并创建了一个列表,然后使用了 savemat。但是,当我在 matlab 中加载时,我只得到单元格数组。我也尝试使用this,但问题是并非所有字段都是具有相同形状的数组,例如'firstframe'是一个int。然后当我使用 fromarrays() 但它抱怨因为形状不匹配。

我现在正在尝试将字典转换为结构化数组,但没有找到任何相关内容。并且还尝试创建一个允许数组使用不同形状的 numpy 记录。任何灯都非常受欢迎

【问题讨论】:

  • Python 对象和 MATLAB 之间的映射很棘手。您可以尝试在 MATLAB 中创建一个示例,保存它,然后loadmat。这应该可以更清楚地了解 MATLAB 需要什么。
  • 我对此有点生疏,但我认为 MATLAB 矩阵映射到订单 F ndarraycell 到对象 dtype 数组上。结构化数组上的struct(即带有复合dtype,在您的链接中记录数组)。进入结构化数组的数组必须在形状上匹配。

标签: python matlab numpy structured-array


【解决方案1】:

八度音

M =

  scalar structure containing the fields:

    x =

       1   2   3   4

    y =

       5   6   7   8

    one =  1
    two =

       1   2

>> save -7 struct.mat M

在 Ipython 中:

In [450]: dat = io.loadmat('struct.mat')
In [451]: dat
Out[451]: 
{'__header__': b'MATLAB 5.0 MAT-file, written by Octave 4.2.2, 2019-02-08 18:49:49 UTC',
 '__version__': '1.0',
 '__globals__': [],
 'M': array([[(array([[1., 2., 3., 4.]]), array([[5., 6., 7., 8.]]), array([[1.]]), array([[1., 2.]]))]],
       dtype=[('x', 'O'), ('y', 'O'), ('one', 'O'), ('two', 'O')])}

这里M 是(1,1) 结构化数组,所有字段都是object dtype。这样他们每个人都可以有自己的形状。标量是 (1,1) 矩阵。

【讨论】:

  • 嘿 hpaulji 你的回答真的让我更接近了。现在我被这个问题困住了。当我尝试重新创建对象时:使用缓冲区设置具有对象成员的 void-array。
猜你喜欢
  • 2019-12-21
  • 2021-11-10
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
  • 2013-03-30
  • 1970-01-01
  • 2020-08-15
  • 2018-11-03
相关资源
最近更新 更多