【问题标题】:Arrays of single-element arrays in Python: why?Python中的单元素数组:为什么?
【发布时间】:2018-02-13 14:28:01
【问题描述】:

在使用scipy.io.loadmat 将在 Matlab 中创建的 .mat 文件加载到 Python 中时,我遇到了一个奇怪的问题。我发现其他帖子中提到了类似的“数组结构”,但没有人解释它们。此外,我找到了解决这个奇怪问题的方法,但我想了解为什么Python(或scipy.io.loadmat)以这种方式处理文件。

假设我在 Matlab 中创建了一个单元格并保存它:

my_data = cell(dim1, dim2);
% Fill my_data with strings and floats...
save('my_data.mat','my_data')

现在我将它加载到 Python 中:

import scipy.io as sio
data = sio.loadmat('my_data.mat')['my_data']

现在data 具有numpy.ndarraydtype object 类型。当我查看切片时,它可能看起来像这样:

data[0]
>>> array([array(['Some descriptive string'], dtype='<U13'),
           array([[3.141592]]), array([[2.71828]]), array([[4.66920]]), etc.
           ], dtype=object).

为什么会发生这种情况?为什么 Python/sio.loadmat 会创建一个单元素数组,而不是浮点数数组(假设我删除了包含字符串的第一列)?

如果我的问题是基本的,我很抱歉,但我真的很想了解似乎不必要的复杂问题。

【问题讨论】:

  • 如何在 Matlab 中填写my_data
  • 在 MATLAB 中,不存在不是数组的变量。单值变量是一个 1x1 矩阵。单元格是一个数组,可以包含 MATLAB 中的任何内容。我假设这种行为来自一个带有数值的单元格并将其加载到 python 中。您需要 MATLAB 中的单元格吗?如果将其保存为矩阵,您将避免这种行为。
  • 我第二个@AnderBiguri。 Matlab 中的单元格可以将 anything 作为元素。同样,dtype=object 数组可以将 anything 作为元素。 loadmat 根本不够聪明,无法确定所有 anything 在特定情况下都是浮点数。最好尽量不要使用单元格和对象数组。
  • @AnderBiguri 和 kazemakase:谢谢你们的回答。因此,MATLAB 中的每个变量都是一个矩阵,因此在 Python 中被视为一个单独的 np.array。我的原始代码使用单元格将时间序列、字符串和单个变量保存在相同的“结构”中。现在将其更改为单个矩阵,并且效果很好。谢谢!
  • @A.Debugne 不,之所以被视为单独的 np.array 是因为您将它存储在一个单元格中。

标签: python arrays matlab numpy scipy


【解决方案1】:

如cmets中所说:

出现这种行为是因为您正在保存一个单元格,一个可以包含任何内容的“数组”。你用大小为 1x1(浮点数)的矩阵填充它。

这就是 python 给你的。 nparraydtype=object 具有内部 1x1 数组。

Python 所做的正是 MATLAB 所做的。对于此示例,您应该避免在 MATLAB 中使用单元格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-14
    • 2018-05-18
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2022-06-13
    相关资源
    最近更新 更多