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

loading .mat and .m files with loadmat in Python

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

ValueError: Unknown mat file type, version 101, 58

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

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

您无法加载 .m 个脚本文件。这些是 MATLAB 自己的脚本文件,它们包含 MATLAB 代码。函数 scipy.io.loadmat 无法解析此代码。

另一方面,该函数可以从 MATLAB .mat 文件加载数据。这是 MATLAB 自己的数据格式,您可以在其中存储变量和数据 - 但不是代码。

参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html.

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

一个.m文件是一个matlab/octave脚本。您没有 "load" 脚本。甚至在 matlab/octave 中也不行。您只能 运行 它,这可能会或可能不会导致您可以将其保存到 .mat 文件中的特定工作区。

python 有 "matlab interfaces",您可以在 python 会话中使用 运行 一个 .m 文件,例如众所周知的官方 MATLAB Engine API for Python, or if you have an older matlab version you could try finding other python matlab interfaces online (a simple google search gave me pymatlab, mlab, mlabwrap etc). If your .m file is octave-compatible (and you have octave installed) you could also try the 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.]]

您可以使用 MATLAB Engine API 到 运行 .m 文件和 MATLAB 函数。它还可以加载 .mat 文件,但可能会有点慢。 https://www.mathworks.com/help/matlab/matlab-engine-for-python.html

使用以下方法加载数据更容易:

numpy.loadtxt('your dot mat file')

对于再次遇到这个问题的人。您可以使用 numpy.loadtxt() 读取由 Octave.

生成的 .mat 个文件

例如。 在八度音程中:

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.]])