读取Python中的.mat文件
可以在Python中读取二进制MATLAB.mat文件吗读取Python中的.mat文件,python,matlab,file-io,scipy,mat-file,Python,Matlab,File Io,Scipy,Mat File,可以在Python中读取二进制MATLAB.mat文件吗 我看到SciPy声称支持读取.mat文件,但我没有成功。我安装了SciPy版本0.7.0,但找不到loadmat()方法。需要导入,import SciPy.io import scipy.io mat = scipy.io.loadmat('file.mat') 无论是scipy.io.savemat,还是scipy.io.loadmat都不适用于MATLAB阵列7.3版。但好的方面是Matlab7.3版文件是hdf5数据集。因此,可
我看到SciPy声称支持读取.mat文件,但我没有成功。我安装了SciPy版本0.7.0,但找不到
loadmat()
方法。需要导入,import SciPy.io
import scipy.io
mat = scipy.io.loadmat('file.mat')
无论是
scipy.io.savemat
,还是scipy.io.loadmat
都不适用于MATLAB阵列7.3版。但好的方面是Matlab7.3版文件是hdf5数据集。因此,可以使用多种工具读取它们,包括
对于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本身的问题。如果你有MATLAB,这可能是值得考虑的(我自己没有尝试过,但它有很多功能,不仅仅是阅读MATLAB文件)。但是,我不知道是否允许将其分发给其他用户(如果这些用户有MATLAB,这可能不是问题。否则,也许NumPy是正确的选择?)
此外,如果您想自己完成所有的基础工作,(如果链接发生变化,请尝试在谷歌上搜索matfile_format.pdf
或其标题MAT-FILE format
)有关文件格式结构的详细文档。这并不像我个人认为的那么复杂,但显然,这不是最简单的方法。它还取决于要支持的.mat
-文件的功能数量
我编写了一个“小”(大约700行)Python脚本,可以读取一些基本的.mat
-文件。我既不是Python专家,也不是初学者,写这篇文章花了我大约两天的时间(使用上面链接的MathWorks文档)。我学到了很多新东西,而且(大多数时候)很有趣。由于我在工作中编写了Python脚本,我恐怕无法发布它。。。但我可以在这里提出一些建议:
- 首先阅读文档
- 使用十六进制编辑器(如)查看要解析的引用
-文件.mat
- 通过将字节保存到.txt文件并注释每行,尝试找出每个字节的含义
- 使用类保存每个数据元素(例如
,miccompressed
,miMATRIX
,或mxDOUBLE
)miINT32
-文件的结构最适合将数据元素保存在树型数据结构中;每个节点有一个类和子节点.mat
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
首先将.mat文件另存为:
save('test.mat', '-v7')
之后,在Python中,使用通常的loadmat
函数:
import scipy.io as sio
test = sio.loadmat('test.mat')
读取文件
import scipy.io
mat = scipy.io.loadmat(file_name)
print(type(mat))
#OUTPUT - <class 'dict'>
检查MAT变量的类型
import scipy.io
mat = scipy.io.loadmat(file_name)
print(type(mat))
#OUTPUT - <class 'dict'>
打印(类型(mat))
#输出-
字典中的键是MATLAB变量,值是分配给这些变量的对象有一个很好的包,名为
pip install mat4py
使用起来很简单(从网站上):
从MAT文件加载数据
import scipy.io
mat = scipy.io.loadmat(file_name)
print(type(mat))
#OUTPUT - <class 'dict'>
函数loadmat
只使用Python的dict
和list
对象,将存储在MAT文件中的所有变量加载到一个简单的Python数据结构中。数值数组和单元格数组将转换为按行排序的嵌套列表。压缩数组以消除只有一个元素的数组。生成的数据结构由与格式兼容的简单类型组成
示例:将MAT文件加载到Python数据结构中:
from mat4py import loadmat
data = loadmat('datafile.mat')
变量data
是一个dict
,其变量和值包含在MAT文件中
将Python数据结构保存到MAT文件中
import scipy.io
mat = scipy.io.loadmat(file_name)
print(type(mat))
#OUTPUT - <class 'dict'>
Python数据可以通过函数savemat
保存到MAT文件中。数据的结构必须与loadmat
的结构相同,即它应该由简单的数据类型组成,如dict
、list
、str
、int
和float
示例:将Python数据结构保存到MAT文件:
from mat4py import savemat
savemat('datafile.mat', data)
参数data
应为带有变量的dict
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文件读取到混合数据类型的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)
这个任务有一个很棒的库:
pymatreader
只需按以下步骤操作:
pip安装pymatreader
from pymatreader Import read\u mat
data=read\u mat('matlab\u struct.mat')
data.keys()
查找数据的实际存储位置
- 这些键通常看起来像:
将是存储数据的实际键。当然,此密钥的名称可以在不同的文件之间更改dict_键([''uuuuuu header'uuuuuuuuu'、''uuuuu version'uuuuuuuuuuu'、''uuuuuuu globals'uuuuuuuuuuuuu'、'uuuuuuuuu globals'、'data'uu opp'])
data\u opp
my_df=pd.dataframe(data['data\u opp'])
就是这样:)也可以使用HDF5存储库。有关matlab版本支持的详细信息,请参阅官方文档
import hdf5storage
label_file = "./LabelTrain.mat"
out = hdf5storage.loadmat(label_file)
print(type(out)) # <class 'dict'>
导入HDF5存储
label_file=“./LabelTrain.mat”
out=hdf5storage.loadmat(标签文件)
打印(打印(输出))#
除了v4(1.0级)、v6、v7至7.2 MATFILE的scipy.io.loadmat
和7.3格式MATFILE的h5py.File
之外,还有另一种类型的MATFILE,采用文本数据格式而不是二进制格式,通常由倍频程创建
scipy.io.loadmat
和h5py.File
都无法加载它们(在scipy 1.5.3和h5py 3.1.0上进行了测试),我找到的唯一解决方案是