【发布时间】: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.ndarray 和dtype 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