Scipy IO Loadmat 错误:ValueError:Mat 4 mopt 格式错误

Posted

技术标签:

【中文标题】Scipy IO Loadmat 错误:ValueError:Mat 4 mopt 格式错误【英文标题】:Scipy IO Loadmat error: ValueError: Mat 4 mopt wrong format 【发布时间】:2021-12-14 17:49:13 【问题描述】:

我看到这个问题没有任何明确的答案,例如here。我有.mat 数据从不同的数据结构转换而来,并尝试使用scipy.io.loadmat 在python 中加载它。对于某些文件,这种方法可以正常工作,但对于其他文件,我会收到此错误:

    mat = sio.loadmat(i, verify_compressed_data_integrity=False)
  File "/Users/aeglick/opt/anaconda3/lib/python3.8/site-packages/scipy-1.7.1-py3.8-macosx-10.9-x86_64.egg/scipy/io/matlab/mio.py", line 226, in loadmat
    matfile_dict = MR.get_variables(variable_names)
  File "/Users/aeglick/opt/anaconda3/lib/python3.8/site-packages/scipy-1.7.1-py3.8-macosx-10.9-x86_64.egg/scipy/io/matlab/mio4.py", line 390, in get_variables
    hdr, next_position = self.read_var_header()
  File "/Users/aeglick/opt/anaconda3/lib/python3.8/site-packages/scipy-1.7.1-py3.8-macosx-10.9-x86_64.egg/scipy/io/matlab/mio4.py", line 346, in read_var_header
    hdr = self._matrix_reader.read_header()
  File "/Users/aeglick/opt/anaconda3/lib/python3.8/site-packages/scipy-1.7.1-py3.8-macosx-10.9-x86_64.egg/scipy/io/matlab/mio4.py", line 108, in read_header
    raise ValueError('Mat 4 mopt wrong format, byteswapping problem?')
ValueError: Mat 4 mopt wrong format, byteswapping problem?

我不确定是什么导致了这个问题。我每次都以相同的方式保存.mat 文件,因此它们都应该是可读的。我也尝试了h5py 并得到了类似的错误。关于如何读取我的数据文件有什么建议吗?

【问题讨论】:

【参考方案1】:

您可能在不知不觉中将 .mat 文件保存为不同的“版本”格式。如果您的代码在没有明确指定格式的情况下调用save(...),它将使用您的 Matlab 会话的默认版本,这是您可以在 Matlab GUI 中设置的持久的每用户首选项。而且如果你没有在Preferences中设置默认格式,save(...)使用的默认版本会随着Matlab版本的不同而不同。

MAT 文件版本之间的差异很大。特别是,v7.3 将格式完全更改为基于 HDF5 的格式(我认为 scipy.io.loadmat 不支持)。见https://www.mathworks.com/help/matlab/import_export/mat-file-versions.html

检查您的实际.mat 文件版本。如果您希望您的代码真正可移植,请更改代码中的 save(...) 调用,以使用 '-v<whatever>' 参数显式指定 MAT 文件版本。

【讨论】:

以上是关于Scipy IO Loadmat 错误:ValueError:Mat 4 mopt 格式错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 scipy.io.loadmat 在 python 中加载 matlab 表

scipy.io.loadmat 嵌套结构(即字典)

使用 scipy.io.loadmat 从 .mat Matlab 文件中将字典键转换为 Python 中具有相同值的变量名

从使用 Scipy.io.loadmat 加载的 .mat 文件访问数组内容 - python

如何使用 Scipy.io.loadmat 将 Matlab mat 文件中的字符串单元格数组加载到 Python 列表或元组中

loadmat python内存错误