【问题标题】:creating Matlab cell arrays in python在 python 中创建 Matlab 单元格数组
【发布时间】:2013-11-16 20:21:40
【问题描述】:

我正在尝试在 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,它必须猜测如何存储它。当您的尺寸匹配时,一个简单的矩阵显然是首选。到目前为止,当尺寸匹配时,我无法将其强制转换为单元格数组。
  • @CaptainMurphy 正如您在我的回答中看到的,您必须使用dtype=object 创建一个数组。

标签: python matlab scipy


【解决方案1】:

当你这样做时:

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)

请注意,我可能对您想要的形状感到困惑,因为您有很多嵌套的括号,所以您可能需要重新调整其中的一些形状,但无论如何这个想法应该成立。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2013-07-28
    • 1970-01-01
    相关资源
    最近更新 更多