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

12

考虑以下 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.io在Python中生成上述数据结构,以便它们可以加载到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的cell数组,而不是结构体数组。

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

注意事项:

  1. 我尝试过savemat('/tmp/p.mat', np.array(struct_array))savemat('/tmp/p.mat', np.array(struct_array,dtype=object)),但都无法解决问题。

我在搜索SPM中处理相同问题的结构体数组时发现了这篇帖子。感谢您的发布! - Ben Smith
1个回答

14
你可以使用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

我可以使用这段代码创建一个数组结构,但我不确定如何创建一个结构体的数组。我尝试先创建结构体,然后再创建数组,但是我有一个字段大小会改变的字典,所以fromarrays无法工作。 - Ivan Felipe Rodríguez
@IvanFelipeRodríguez 你尝试过创建一个对象数组,其中每个元素都是一个记录数组吗?你可以使用上述方法创建每个元素,然后将它们分配给对象数组。 - TheBlackCat
嘿@TheBlackCat。感谢您查看这个问题。我刚试图将每个元素初始化为记录,但当我从数组运行时...它会引发“空数据类型”的错误。 - Ivan Felipe Rodríguez
我在这里发布了我的问题:[https://stackoverflow.com/questions/54598286/how-to-save-a-list-of-python-dictionaries-as-an-array-of-matlab-structured-array] - Ivan Felipe Rodríguez
1
除了这种情况,这对我很有效:myrec = fromarrays([[1, 10], [[2,3], [20, 22]]], names=['field1', 'field2'])。我想使用它来存储一个结构体数组,其中一些结构体字段是Matlab数组。我得到了ValueError: array-shape mismatch。如何将数组存储为结构体字段? - 3bdalla

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接