小编典典

如何从scipy.io创建Matlab结构数组?

python

考虑下面的Matlab代码:

pmod(1).name{1}  = 'regressor1';
pmod(1).param{1} = [1 2 4 5 6];
pmod(1).poly{1}  = 1; 
pmod(2).name{1}  = 'regressor2-1';
pmod(2).param{1} = [1 3 5 7]; 
pmod(2).poly{1}  = 1;

这将创建一个结构数组。数组中的每个结构都包含三个类型为的字段cell。因此,我们在以下层次结构中pmod

pmod  // struct array
|
*- struct
|  |
|  *- cell  // contains 1 or more strings
|  *- cell  // contains 1 or more arrays
|  *- cell  // contains 1 or more arrays
|
*- struct [...]

我试图用scipy.ioPython生成上述数据结构,以便可以将它们加载到Matlab中(SPM要求此层次结构)。

创建一个结构很简单,因为scipy.io.savemat将所有键都是类型的字典保存str为Matlab结构:

from scipy.io import savemat

struct = {
    'field1': 1,
    'field2': 2,
}

savemat('/tmp/p.mat', {'a_struct': struct})

但是,当尝试将其推广到结构 数组时 ,我遇到了以下障碍:

struct_array = [struct, struct]
savemat('/tmp/p.mat', {'s_array': struct_array})

这不符合预期。当加载p.mat到Matlab中时,我得到一个1x2的 单元格 数组,而不是一个结构体数组。

如何使用创建结构数组scipy.io

笔记:

  1. 我尝试了savemat('/tmp/p.mat', np.array(struct_array))savemat('/tmp/p.mat', np.array(struct_array, dtype=object)),但无济于事。

阅读 206

收藏
2020-12-20

共1个答案

小编典典

您可以np.core.records.fromarrays用来构造一个记录数组,该数组大致等效于MATLAB结构,并将通过转换为MATLAB结构scip.io.savemat

from numpy.core.records import fromarrays
from scipy.io import savemat

myrec = fromarrays([[1, 10], [2, 20]], names=['field1', 'field2'])
savemat('p.mat', {'myrec': myrec})

在MATLAB中打开时,将得到:

>> load('p.mat')
>> myrec

myrec =

1x2 struct array with fields:

    field1
    field2
2020-12-20