是否可以在Python中读取二进制MATLAB .mat文件?
我看到SciPy声称支持读取.mat文件,但我没有成功。我安装了SciPy 0.7.0版本,但找不到loadmat()方法。
是否可以在Python中读取二进制MATLAB .mat文件?
我看到SciPy声称支持读取.mat文件,但我没有成功。我安装了SciPy 0.7.0版本,但找不到loadmat()方法。
当前回答
既不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
其他回答
还有MathWorks本身的Python MATLAB引擎。如果你有MATLAB,这可能值得考虑(我自己没有尝试过,但它有很多功能,而不仅仅是读取MATLAB文件)。然而,我不知道是否允许将其分发给其他用户(如果这些人拥有MATLAB,这可能不是问题。否则,也许NumPy才是正确的选择?)
此外,如果您想自己完成所有的基础工作,MathWorks提供了关于文件格式结构的详细文档(如果链接更改,请尝试谷歌获取matfile_format.pdf或其标题MAT-FILE Format)。这并不像我个人想的那么复杂,但显然,这不是最简单的方法。这也取决于你想要支持多少个.mat文件的特性。
我写了一个“小”(大约700行)的Python脚本,它可以读取一些基本的.mat文件。我既不是Python专家,也不是初学者,我花了大约两天时间来编写它(使用上面链接的MathWorks文档)。我学到了很多新东西,而且很有趣(大部分时间)。由于Python脚本是我在工作中编写的,恐怕我不能发布它…但我可以在这里给出一些建议:
首先阅读文档。 使用十六进制编辑器(如HxD)并查看您想要解析的引用.mat文件。 通过将字节保存到.txt文件中并注释每行来尝试找出每个字节的含义。 使用类保存每个数据元素(如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文件。
首先将.mat文件保存为:
save('test.mat', '-v7')
之后,在Python中,使用常用的loadmat函数:
import scipy.io as sio
test = sio.loadmat('test.mat')
将mat文件读入混合数据类型的pandas dataFrame
import scipy.io as sio
mat=sio.loadmat('file.mat')# load mat-file
mdata = mat['myVar'] # variable in mat file
ndata = {n: mdata[n][0,0] for n in mdata.dtype.names}
Columns = [n for n, v in ndata.items() if v.size == 1]
d=dict((c, ndata[c][0]) for c in Columns)
df=pd.DataFrame.from_dict(d)
display(df)
在我自己努力解决这个问题并尝试其他库(我不得不说mat4py也是一个很好的库,但有一些限制)之后,我构建了这个库(“matdata2py”),它可以处理大多数变量类型,对我来说最重要的是“字符串”类型。.mat文件需要保存在-V7.3版本中。我希望这对社区有用。
安装:
pip install matdata2py
如何使用这个库:
import matdata2py as mtp
加载Matlab数据文件:
Variables_output = mtp.loadmatfile(file_Name, StructsExportLikeMatlab = True, ExportVar2PyEnv = False)
print(Variables_output.keys()) # with ExportVar2PyEnv = False the variables are as elements of the Variables_output dictionary.
使用ExportVar2PyEnv = True,你可以分别看到每个变量作为与Mat文件中保存的同名的python变量。
国旗的描述
StructsExportLikeMatlab = True/False结构导出为字典格式(False)或类似于Matlab的基于点的格式(True)
ExportVar2PyEnv = True/False将单个字典中的所有变量导出(True)或作为单独的单独变量导出到python环境中(False)