为了账号安全,请及时绑定邮箱和手机立即绑定

使用 scipy.io savemat 将多个 Python 字典转换为 MATLAB 结构体数组

使用 scipy.io savemat 将多个 Python 字典转换为 MATLAB 结构体数组

杨魅力 2022-11-01 17:03:57
一个简单的问题,但我似乎无法理解。我正在使用该scipy.io库将 Python 字典保存为 Matlab 结构。现在,该库的文档scipy.io向我们展示了如何将单个 Python 字典转换为单个 Matlab 结构:>>> a_dict = {'field1': 0.5, 'field2': 'a string'} >>> sio.savemat('saved_struct.mat', {'a_dict': a_dict})这听起来很公平,并且有效:但是,我现在想对多个 Python 字典执行相同的操作。我希望将它们转换为 Matlab 结构,其中列名等于所有字典的键(显然都是相同的键名),并且我希望每一行代表其中一个键的值字典。如果我没看错,这称为 1 x K 结构,有 10 个字段,其中 K 是我要映射的行数(Python 字典)。字段示例如下所示:尽管我自己完全不知道正确的 Matlab 术语,但评论中的一个好人告诉我这应该被称为结构数组。我尝试简单地创建一个 Python 字典的 numpy 数组,将其放在a_dict上面代码示例的键值对中并保存,但没有成功。这样做会导致所有不同结构的列表,而不是一个大结构,其中行表示每个单独结构的值。因此,我仍在为这个问题寻找合适的解决方案。如果您需要任何其他详细信息,请随时在评论中提问。感谢您的帮助!
查看完整描述

2 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

这是一个解决方案:


在 Python 中:


>>> a_dict = {'field1': 0.5, 'field2': 'a string'}

>>> b_dict = {'field1': 1, 'field2': 'another string'}

>>> sio.savemat('saved_struct.mat', {'dict_array':[a_dict,b_dict]})

在 MATLAB 中:


s = load('saved_struct.mat');

struct_array = [s.dict_array{:}];

您将根据需要在 MATLAB 中得到一个结构体数组。


struct_array = 


  1×2 struct array with fields:


    field1

    field2


查看完整回答
反对 回复 2022-11-01
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

为了澄清structured array建议,我将举一个例子。


定义一个结构化数组:


In [192]: arr = np.array([(0.5,'one'),(0.6,'two'),(0.8,'three')], dtype=[('field1',float),('field2','U10')])                                                                                        

以及具有相同字段和数据的字典列表:


In [194]: dicts = [{'field1':0.5, 'field2':'one'},{'field1':0.6, 'field2':'two'},{'field1':0.8,'field2':'three'}]


In [195]: arr                                                                                          

Out[195]: 

array([(0.5, 'one'), (0.6, 'two'), (0.8, 'three')],

      dtype=[('field1', '<f8'), ('field2', '<U10')])


In [196]: dicts                                                                                        

Out[196]: 

[{'field1': 0.5, 'field2': 'one'},

 {'field1': 0.6, 'field2': 'two'},

 {'field1': 0.8, 'field2': 'three'}]

保存和加载:


In [197]: io.savemat('ones.mat', {'arr':arr, 'dicts':dicts})                                           

In [198]: io.loadmat('ones.mat')                                                                       

Out[198]: 

{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Fri May  1 09:06:19 2020',

 '__version__': '1.0',

 '__globals__': [],

 'arr': array([[(array([[0.5]]), array(['one'], dtype='<U3')),

         (array([[0.6]]), array(['two'], dtype='<U3')),

         (array([[0.8]]), array(['three'], dtype='<U5'))]],

       dtype=[('field1', 'O'), ('field2', 'O')]),

 'dicts': array([[array([[(array([[0.5]]), array(['one'], dtype='<U3'))]],

       dtype=[('field1', 'O'), ('field2', 'O')]),

         array([[(array([[0.6]]), array(['two'], dtype='<U3'))]],

       dtype=[('field1', 'O'), ('field2', 'O')]),

         array([[(array([[0.8]]), array(['three'], dtype='<U5'))]],

       dtype=[('field1', 'O'), ('field2', 'O')])]], dtype=object)}

savemat创建了一些对象 dtype 数组(和字段)和 2d MATLAB 类数组。


在 Octave 会话中:


>> load ones.mat

这arr是一个struct array有2个字段:


>> arr

arr =


  1x3 struct array containing the fields:


    field1

    field2


>> arr.field1

ans =  0.50000

ans =  0.60000

ans =  0.80000

>> arr.field2

ans = one

ans = two

ans = three

dicts是具有标量结构的单元:


>> dicts

dicts =

{

  [1,1] =


    scalar structure containing the fields:


      field1 =  0.50000

      field2 = one


  [1,2] =


    scalar structure containing the fields:


      field1 =  0.60000

      field2 = two


  [1,3] =


    scalar structure containing the fields:


      field1 =  0.80000

      field2 = three


}

可以转换为与@Unbearable 显示的相同的结构数组:


>> [dicts{:}]

ans =


  1x3 struct array containing the fields:


    field1

    field2


>> _.field1

error: '_' undefined near line 1 column 1

>> [dicts{:}].field1

ans =  0.50000

ans =  0.60000

ans =  0.80000

>> [dicts{:}].field2

ans = one

ans = two

ans = three


查看完整回答
反对 回复 2022-11-01
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信