在Python中能否读取二进制MATLAB .mat文件?
我看到SciPy声称支持读取.mat文件,但我用它不成功。我安装了版本为0.7.0的SciPy,但找不到loadmat()
方法。
需要导入模块,import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
对于MATLAB数组版本7.3,既不能使用scipy.io.savemat
,也不能使用scipy.io.loadmat
。但好消息是,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
f.keys()
会显示您可以访问的内容。 - Packard CPW首先将.mat文件保存为:
save('test.mat', '-v7')
然后,在Python中使用通常的loadmat
函数:
import scipy.io as sio
test = sio.loadmat('test.mat')
有一个很好的软件包叫做 mat4py
,可以很容易地使用以下方法进行安装:
pip install mat4py
这是一个易于使用的工具(来自网站):
从MAT文件中加载数据
函数loadmat
将存储在MAT文件中的所有变量加载到简单的Python数据结构中,仅使用Python的dict
和list
对象。 数字和单元数组转换为行顺序嵌套列表。 数组被压缩以消除只有一个元素的数组。 生成的数据结构由与JSON格式兼容的简单类型组成。
示例:将MAT文件加载到Python数据结构中:
from mat4py import loadmat
data = loadmat('datafile.mat')
data
是一个dict
,其中包含在MAT文件中的变量和值。
将Python数据结构保存到MAT文件
可以使用函数savemat
将Python数据保存到MAT文件中。数据必须按照与loadmat
相同的方式进行结构化,即它应由简单的数据类型组成,如dict
、list
、str
、int
和float
。from mat4py import savemat
savemat('datafile.mat', data)
data
应该是一个包含变量的dict
。mat4py/cmd.py my.mat
会将my.json
写成1行长的文件。) - denismat4py.loadmat.ParseError: 只能读取 Matlab 5 级别的 MAT 文件
。 - s2t2如果安装了MATLAB 2014b或更新版本,则可以使用Python的MATLAB引擎:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
读取文件
import scipy.io
mat = scipy.io.loadmat(file_name)
检查MAT变量的类型
print(type(mat))
#OUTPUT - <class 'dict'>
词典中的键是MATLAB变量,而值则是分配给这些变量的对象。
有一个很好的库可以完成这个任务,叫做:pymatreader
。
只需要按照以下步骤操作:
安装包:pip install pymatreader
导入相关功能:from pymatreader import read_mat
使用该函数读取matlab struct:data = read_mat('matlab_struct.mat')
使用 data.keys()
定位实际存储数据的位置。
dict_keys(['__header__', '__version__', '__globals__', 'data_opp'])
。其中data_opp
将是实际存储数据的关键字。当然,在不同的文件之间可以更改此键的名称。my_df = pd.DataFrame(data['data_opp'])
就是这样 :)
还有由MathWorks开发的MATLAB Engine for Python。如果你拥有MATLAB,这可能值得考虑(我个人没有尝试过,但它比仅仅读取MATLAB文件拥有更多的功能)。然而,我不知道是否允许将其分发给其他用户(如果那些人拥有MATLAB,则可能不是问题。否则,NumPy可能是正确的选择?)
此外,如果您想自己完成所有基础工作,MathWorks提供了一份关于文件格式结构的详细文档(如果链接失效,请尝试Google搜索“matfile_format.pdf”或其标题“MAT-FILE Format”)。这不像我个人认为的那么复杂,但显然这不是最简单的方法。这也取决于您要支持多少.mat
文件的功能。
我写了一个“小”(大约700行)的Python脚本,可以读取一些基本的.mat
文件。我既不是Python专家也不是初学者,用了大约两天时间来编写它(使用上面链接的MathWorks文档)。我学到了很多新东西,也很有趣(大部分时间)。由于我在工作中编写了Python脚本,所以恐怕无法发布它...但我可以在这里提供一些建议:
.mat
文件。miCOMPRESSED
、miMATRIX
、mxDOUBLE
或miINT32
).mat
文件的结构最适合将数据元素保存在树状数据结构中,每个节点有一个类和子节点。将mat文件读取为带有混合数据类型的pandas数据框
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)
scipy.io.loadmat
和针对7.3格式mat文件使用的h5py.File
外,在文本数据格式下有另一种类型的mat文件,通常是由Octave创建的,这些mat文件甚至无法在MATLAB中读取。无论是scipy.io.loadmat
还是h5py.File
都不能加载它们(已针对scipy 1.5.3和h5py 3.1.0进行测试),我找到的唯一解决方案是numpy.loadtxt
。import numpy as np
mat = np.loadtxt('xxx.mat')
.mat
文件,这将导致UnicodeDecodeError
。 - emilaznp.loadtxt
只适用于由 Octave 生成的 .mat
文件。 - MrCrHaM