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

11

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

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

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

我不知道如何解决这个问题,所以非常感谢您能帮助我。


@TasosPapastylianou:哇,非常感谢。那么我该如何在Python中加载/运行.m文件呢? - user177196
6个回答

7

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

.m文件是matlab / octave脚本。您不会“加载”脚本,即使在matlab / octave中也是如此。您只能运行它,这可能会导致您可以将其保存到.mat文件中的特定工作区。

有适用于python的“matlab接口”,您可以使用它们从python会话中运行.m文件,例如官方的MATLAB Engine API for Python,如果您有较旧的matlab版本,则可以尝试在线查找其他python matlab接口(简单的谷歌搜索给了我pymatlabmlabmlabwrap等)。如果您的.m文件与octave兼容(并且您安装了octave),则还可以尝试oct2py接口,该接口已知工作得很好。安装了其中一个接口后,您可以尝试运行脚本,然后将工作区变量转移到python中,或者使用接口将其保存到.mat文件中,然后像通常一样使用scipy.io.loadmat将其加载回到python中。

至于.mat文件给您一个错误,最有可能的原因是它是较新版本的.mat规范,python尚未识别(您使用的matlab版本是什么?)。尝试在matlab(或octave)中加载.mat文件,并使用-v7选项重新保存。然后python应该能够毫无问题地打开它。

编辑:这里是一个示例,通过oct2py运行一个octave脚本,将生成的octave工作区保存到.mat文件中,并通过scipy.io.loadmat.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.]]

非常感谢您的详细帮助。我已经安装了Octave,并且能够在Jupyter Notebooks中使用Python导入oct2py函数。但是,我需要使用哪种Python函数来运行.m文件?并且如何将.m文件保存为Python中的.mat文件? - user177196
1
@user177196,我添加了一个例子,希望能有所帮助。我觉得有必要再次强调,你不会“加载”或“保存”一个.m文件。.m文件是一个脚本,你需要运行它,而不是一个“包含”数据的文件。 - Tasos Papastylianou

2

针对再次遇到此问题的人们,您可以使用numpy.loadtxt()读取由Octave生成的.mat文件。

例如,在Octave中:

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

如果您的.mat文件由具有相同维度的数组组成,则可能是这种情况。但是,.mat文件可以更加复杂。您可以拥有混合数据类型和不同维度的数组,甚至是嵌套数组。因此,在我看来,这不是一个真正的解决方案。 - steTATO
@steTATO,很好,你能否添加一个解决你所发现问题的答案? - arilwan
使用scipy.io.loadmat的被接受答案对我很有帮助,但前提是我在保存.mat文件时选择了-v7选项。我也尝试过np.loadtxt,但正如我所说,它无法处理具有多个不同变量类型/形状的数据结构。 - steTATO

2
您无法加载.m脚本文件。这些是MATLAB自己的脚本文件,它们包含MATLAB代码。函数scipy.io.loadmat无法解析此代码。
另一方面,该函数可以从MATLAB .mat文件中加载数据。这是MATLAB自己的数据格式,您可以在其中存储变量和数据,但不能存储代码。
参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.io.loadmat.html

我该如何运行.m脚本文件?声明:我在学习神经网络的Coursera课程时遇到了这个问题。 - user177196

1
更简单的方法是使用以下代码加载数据:

numpy.loadtxt('your dot mat file')

1
".mat" 文件不是一个 numpy 保存的文本文件,因此无法加载。 - Rahat Zaman
@RahatZaman numpy.loadtxt() 也适用于由Octave生成的.mat文件,至少是这样。 - arilwan

0

0
scipy.io模块无法读取由较新的h5py格式保存的.mat文件。 您可以尝试使用h5py模块来加载它。 此外,通道优先级不同:列优先和行优先。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接