【问题标题】:scipy.io.loadmat reads MATLAB (R2016a) structs incorrectlyscipy.io.loadmat 错误地读取 MATLAB (R2016a) 结构
【发布时间】:2016-12-26 23:19:22
【问题描述】:

scipy.io.loadmat 不是将 MATLAB 结构加载为 dict(如 http://docs.scipy.org/doc/scipy/reference/tutorial/io.html 和其他相关问题中所述),而是将其加载为一个奇怪的 ndarray,其中值是数组数组,而字段名称被视为 dtype。最小的例子:

(MATLAB):

>> a = struct('b',0)

a = 

    b: 0

>> save('simple_struct.mat','a')

(Python):

In[1]:
import scipy.io as sio
matfile = sio.loadmat('simple_struct.mat')
a = matfile['a']
a

Out[1]:
array([[([[0]],)]], 
      dtype=[('b', 'O')])

此问题在 Python 2 和 3 中仍然存在。

【问题讨论】:

  • 您是否真的阅读了上面使用的文档链接中的MATLAB structs section?看起来这是所有预期的行为......它继续描述如何使用 squeeze_mestruct_as_record 参数。
  • 不够紧密!谢谢。我猜在这个问题link 和现在之间,structs_as_record 默认已变为 True。

标签: python matlab


【解决方案1】:

这是预期的行为。 Numpy 只是表明你有 MATLAB 在后台存储你的数据。

MATLAB 结构是二维元胞数组,其中一维映射到字符串序列。在 Numpy 中,同样的数据结构称为“记录数组”,dtype 用于存储名称。而且由于 MATLAB 矩阵必须至少是二维的,所以您存储在 MATLAB 中的 0 实际上是一个二维矩阵,其维度为 (1, 1)

所以您在scipy.io.loadmat 中看到的是 MATLAB 如何存储您的数据(减去 dtype 位,MATLAB 没有这样的东西)。具体来说,它是一个 2D [1, 1] 数组(也就是 Numpy 所谓的元胞数组),其中一维映射到一个字符串,其中包含一个 [1, 1] 2D 数组。 MATLAB 会向您隐藏其中一些细节,但 numpy 不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-13
    • 2011-10-23
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    相关资源
    最近更新 更多