是否可以在Python中读取二进制MATLAB .mat文件?
我已经看到SciPy声称支持读取.mat文件,但是我没有成功。我安装了SciPy 0.7.0版,但找不到该loadmat()
方法。
是否可以在Python中读取二进制MATLAB .mat文件?
我已经看到SciPy声称支持读取.mat文件,但是我没有成功。我安装了SciPy 0.7.0版,但找不到该loadmat()
方法。
Answers:
需要导入,import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
save('myfile.mat','-v7')
无论是scipy.io.savemat
,还是scipy.io.loadmat
对于MATLAB阵列的7.3版本的工作。但是好消息是MATLAB版本7.3文件是hdf5数据集。因此,可以使用许多工具(包括NumPy)读取它们。
对于Python,您将需要h5py
扩展,该扩展在系统上需要HDF5。
import numpy as np
import h5py
f = h5py.File('somefile.mat','r')
data = f.get('data/variable1')
data = np.array(data) # For converting to a NumPy array
save
(至少在Matlab R2014b中使用)会导致文件无法使用上述技术读取。如果确实使用“ -v7.3”标志,则可以很好地读取数字数据。
save('filename', '-v7.3', 'var1');
首先将.mat文件另存为:
save('test.mat', '-v7')
之后,在Python中,使用通常的loadmat
函数:
import scipy.io as sio
test = sio.loadmat('test.mat')
有一个很好的软件包mat4py
,可以很容易地使用安装
pip install mat4py
使用起来很简单(从网站上):
从MAT文件加载数据
该函数loadmat
仅使用Python dict
和list
对象将MAT文件中存储的所有变量加载到简单的Python数据结构中。数字和单元格数组将转换为按行排序的嵌套列表。压缩数组以消除仅包含一个元素的数组。结果数据结构由与JSON格式兼容的简单类型组成。
示例:将MAT文件加载到Python数据结构中:
from mat4py import loadmat
data = loadmat('datafile.mat')
变量data
是dict
带有MAT文件中包含的变量和值的a 。
将Python数据结构保存到MAT文件
可以使用函数将Python数据保存到MAT文件中savemat
。数据已经以同样的方式为被结构化的loadmat
,也就是说,它应该由简单数据类型,像dict
,list
,str
,int
,和float
。
示例:将Python数据结构保存到MAT文件中:
from mat4py import savemat
savemat('datafile.mat', data)
参数data
应为dict
带有变量的a。
mat4py/cmd.py my.mat
写的my.json
是1行)
mat4py.loadmat.ParseError: Can only read from Matlab level 5 MAT-files
MathWorks本身也提供用于Python的MATLAB引擎。如果您有MATLAB,则可能值得考虑(我自己还没有尝试过,但是它具有比仅读取MATLAB文件更多的功能)。但是,我不知道是否允许将其分发给其他用户(如果这些人拥有MATLAB,这可能不是问题。否则,也许NumPy是正确的选择?)。
另外,如果您想自己掌握所有基础知识,MathWorks将提供有关文件格式结构的详细文档(如果链接发生更改,请尝试使用google matfile_format.pdf
或其标题MAT-FILE Format
)。它并不像我个人想象的那样复杂,但是显然,这不是最简单的方法。它还取决于.mat
您要支持-files的多少功能。
我编写了一个“小”(约700行)Python脚本,该脚本可以读取一些基本的.mat
-files。我既不是Python专家,也不是初学者,我花了大约两天时间来编写它(使用上面链接的MathWorks文档)。我学到很多新东西,这很有趣(大部分时间)。当我在工作时编写Python脚本时,恐怕我无法发布它了……但是我可以在这里给出一些建议:
.mat
要解析的参考文件。miCOMPRESSED
,miMATRIX
,mxDOUBLE
,或miINT32
).mat
-files'结构是最佳的用于保存在一个树形数据结构中的数据元素; 每个节点都有一个类和子节点from os.path import dirname, join as pjoin
import scipy.io as sio
data_dir = pjoin(dirname(sio.__file__), 'matlab', 'tests', 'data')
mat_fname = pjoin(data_dir, 'testdouble_7.4_GLNX86.mat')
mat_contents = sio.loadmat(mat_fname)
您可以使用上面的代码在Python中读取默认保存的.mat文件。