考虑下面的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:
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
创建一个结构很简单,因为scipy.io.savemat将所有键都是类型的字典保存str为Matlab结构:
scipy.io.savemat
str
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的 单元格 数组,而不是一个结构体数组。
p.mat
savemat('/tmp/p.mat', np.array(struct_array))
savemat('/tmp/p.mat', np.array(struct_array, dtype=object))
您可以np.core.records.fromarrays用来构造一个记录数组,该数组大致等效于MATLAB结构,并将通过转换为MATLAB结构scip.io.savemat。
np.core.records.fromarrays
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