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

blz*_*blz 7 python matlab scipy

考虑以下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;
Run Code Online (Sandbox Code Playgroud)

这会创建一个struct数组.数组中的每个结构包含三个类型的字段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 [...]
Run Code Online (Sandbox Code Playgroud)

我正在尝试用scipy.ioPython生成上述数据结构,这样它们就可以加载到Matlab中(SPM需要这种层次结构).

创建一个结构是很简单的,因为scipy.io.savemat保存任何类型的dict str作为Matlab结构类型的dict :

from scipy.io import savemat

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

savemat('/tmp/p.mat', {'a_struct': struct})
Run Code Online (Sandbox Code Playgroud)

但是,在尝试将其概括为结构数组时,我遇到了以下障碍:

struct_array = [struct, struct]
savemat('/tmp/p.mat', {'s_array': struct_array})
Run Code Online (Sandbox Code Playgroud)

这不符合预期; 加载p.mat到Matlab时,我得到一个1x2的单元格数组,而不是一个struct数组.

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

笔记:

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

The*_*Cat 6

可以使用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})
Run Code Online (Sandbox Code Playgroud)

在 MATLAB 中打开时,这给出:

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

myrec = 

1x2 struct array with fields:

    field1
    field2
Run Code Online (Sandbox Code Playgroud)