在Python中创建Matlab单元数组

6
我正在尝试在Python中创建一个Matlab单元格数组并将其保存为.mat文件,但是当所有单元格都包含2个值时,我遇到了问题:
import scipy.io as sio

twoValues = {'a': array([[array([[2, 2]]), array([[3, 3]])]])}
sio.savemat('test.mat',twoValues)

使用Matlab:

load('test.mat')
>>> a

a(:,:,1,1) =

           2           3


a(:,:,1,2) =

           2           3


>>> class(a)

ans =

int32

回到Python中:

threeValues = {'a': array([[array([[2, 2, 2]]), array([[3, 3]])]])}
sio.savemat('test.mat',threeValues)

在Matlab中:

>>> a

a = 

    [3x1 int32]    [2x1 int32]


>>> class(a)

ans =

cell

这是什么原因呢?

array()试图以最有效的方式打包您的值,因为您没有指定dtype,它必须猜测如何存储它。当您的维度匹配时,明显首选是一个简单的矩阵。但是,当维度匹配时,我尝试将其强制转换为单元数组,但迄今为止未成功。 - engineerC
@CaptainMurphy,正如我在答案中所示,您需要创建一个dtype=object的数组。 - askewchan
1个回答

13

当您执行以下操作时:

a = np.array([[np.array([[2, 2]]), np.array([[3, 3]])]])

最终调用np.array实际上连接了内部的两个数组,因此最终得到一个数组:
>>> a
array([[[[2, 2]],

        [[3, 3]]]])

>>> a.shape
(1, 2, 1, 2)

但是如果要模仿一个cell array,你需要基本上有一个数组的数组。你可以通过设置dtype=object来实现这一点,但是你必须分别创建数组并设置元素,以避免自动合并。

three = array([[array([[2, 2, 2]]), array([[3, 3]])]])
two = np.empty(three.shape, dtype=object)
two[0,0,0] = np.array([[2,2]])
two[0,1,0] = np.array([[3,3]])

那么:

sio.savemat('two.mat', {'two': two})

查看它们的外观:

>>> two
array([[[array([[2, 2]])],
        [array([[3, 3]])]]], dtype=object)

>>> two.shape
(1, 2, 1)

请注意,由于您有很多嵌套的括号,我可能会对您想要的形状感到困惑,因此您可能需要重新调整一些内容,但是这个想法应该仍然保持不变。

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