我正在学习神经网络课程,尝试使用scipy.io.loadmat(filename)
从Python加载.mat
文件,但是我一直收到以下错误信息:
ValueError: 未知的mat文件类型,版本101,58
同样的消息也出现在我尝试使用scipy.io.loadmat()
加载.m文件而不是.mat
文件时。
我不知道如何解决这个问题,所以非常感谢您能帮助我。
我正在学习神经网络课程,尝试使用scipy.io.loadmat(filename)
从Python加载.mat
文件,但是我一直收到以下错误信息:
ValueError: 未知的mat文件类型,版本101,58
同样的消息也出现在我尝试使用scipy.io.loadmat()
加载.m文件而不是.mat
文件时。
我不知道如何解决这个问题,所以非常感谢您能帮助我。
(将我的评论转换为答案)
.m
文件是matlab / octave脚本。您不会“加载”脚本,即使在matlab / octave中也是如此。您只能运行它,这可能会导致您可以将其保存到.mat
文件中的特定工作区。
有适用于python的“matlab接口”,您可以使用它们从python会话中运行.m
文件,例如官方的MATLAB Engine API for Python,如果您有较旧的matlab版本,则可以尝试在线查找其他python matlab接口(简单的谷歌搜索给了我pymatlab、mlab、mlabwrap等)。如果您的.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.]]
.m
文件?并且如何将.m
文件保存为Python中的.mat
文件? - user177196.m
文件。.m
文件是一个脚本,你需要运行它,而不是一个“包含”数据的文件。 - Tasos Papastylianou针对再次遇到此问题的人们,您可以使用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
文件可以更加复杂。您可以拥有混合数据类型和不同维度的数组,甚至是嵌套数组。因此,在我看来,这不是一个真正的解决方案。 - steTATOscipy.io.loadmat
的被接受答案对我很有帮助,但前提是我在保存.mat
文件时选择了-v7
选项。我也尝试过np.loadtxt
,但正如我所说,它无法处理具有多个不同变量类型/形状的数据结构。 - steTATO.m
脚本文件。这些是MATLAB自己的脚本文件,它们包含MATLAB代码。函数scipy.io.loadmat
无法解析此代码。.mat
文件中加载数据。这是MATLAB自己的数据格式,您可以在其中存储变量和数据,但不能存储代码。
numpy.loadtxt('your dot mat file')
numpy.loadtxt()
也适用于由Octave生成的.mat
文件,至少是这样。 - arilwan