在 Python 中使用 loadmat 加载 .mat 和 .m 文件

新手上路,请多包涵

我目前正在学习神经网络课程,我正在尝试使用 scipy.io.loadmat(filename) --- 从 Python 加载 .mat 文件,但我不断收到以下错误消息:

ValueError:未知的 mat 文件类型,版本 101、58

当我尝试加载 .m 文件而不是 .mat 文件时出现相同的消息,使用 scipy.io.loadmat()

我不知道如何解决这个问题,所以如果这里有人能帮助我,我将不胜感激。

原文由 user177196 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

(将我的评论转化为答案)

一个 .m 文件是一个 matlab / octave 脚本。您不“加载”脚本。甚至在 matlab/octave 中也不行。您只能运行它,这可能会或可能不会产生一个特定的工作区,然后您可以将其保存到 .mat 文件中。

有用于 python 的“matlab 接口”,您可以使用它在 python 会话中运行 .m 文件,例如 Python 的官方 MATLAB 引擎 API ,或者如果您有较旧的 matlab 版本,您可以尝试查找其他在线 python matlab 接口(一个简单的谷歌搜索给了我 pymatlabmlabmlabwrap 等)。如果您的 .m 文件与八度兼容(并且您安装了八度),您还可以尝试使用已知运行良好的 oct2py 接口。安装这些接口之一后,您可以尝试运行脚本,然后将工作区变量传输到 python,或者使用接口保存到 .mat 文件,然后使用 scipy.io.loadmat 将其加载回 python --- 和平常一样。

至于 .mat 文件给你一个错误,最可能的原因是它是 .mat 规范的更新版本,python 还不能识别(你使用的是什么 matlab 版本?)。尝试在 matlab(或 Octave)中加载 .mat 文件并使用 -v7 选项再次保存它。然后 Python 应该可以毫无问题地打开它。

编辑: 这是一个通过 oct2py 运行八度脚本的示例,将生成的八度工作空间保存到 .mat 文件中,并将 .mat 文件加载到 python 中。

 %% file myscript.m located at /home/tasos/Desktop
a = 1
b = 2
c = 3

 # from python:
from oct2py import octave as oct
oct.eval("cd /home/tasos/Desktop")
oct.eval("myscript")
oct.eval("save -v7 myworkspace.mat")

from scipy.io import loadmat
D = loadmat("/home/tasos/Desktop/myworkspace.mat")
print D.keys()
#>>> ['a', 'c', 'b', '__header__', '__globals__', 'ans', '__version__']
print D['a'], D['b'], D['c']
#>>> [[ 1.]] [[ 2.]] [[ 3.]]

原文由 Tasos Papastylianou 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于再次出现这个问题的人。您可以使用 numpy.loadtxt() 读取 .matOctave 生成的文件。

例如。在八度:

 octave:1> arr1 = [1,2]
octave:2> arr2 = [2,3]
octave:3> save mydata.mat arr1 arr2

然后在 Python 解释器中读取 mydata.mat

 >>> import numpy as np
>>> data = np.loadtxt('mydata.mat')
>>> data
array([[1., 2.],
       [2., 3.]])

原文由 arilwan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进