考虑以下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;
这会创建一个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 [...]
我尝试使用scipy.io
在Python中生成上述数据结构,以便将它们加载到Matlab中(SPM需要此层次结构)。
创建一个结构很简单,因为scipy.io.savemat
将所有类型为str
的dict保存为Matlab结构:
from scipy.io import savemat
struct = {
'field1': 1,
'field2': 2,
}
savemat('/tmp/p.mat', {'a_struct': struct})
但是,在尝试将其概括为struct array 时,我遇到了以下障碍:
struct_array = [struct, struct]
savemat('/tmp/p.mat', {'s_array': struct_array})
这不符合预期;在将p.mat
加载到Matlab中时,我得到一个1x2 单元数组,而不是结构数组。
scipy.io
创建结构数组?savemat('/tmp/p.mat', np.array(struct_array))
和savemat('/tmp/p.mat', np.array(struct_array, dtype=object))
,但无济于事。答案 0 :(得分:3)
您可以使用np.core.records.fromarrays
构建一个记录数组,该数组大致相当于MATLAB结构,并将由scip.io.savemat
转换为MATLAB结构。
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