使用 Python 读取 .mat 文件
- 2024-12-25 08:50:00
- admin 原创
- 230
问题描述:
是否可以用 Python 读取二进制 MATLAB .mat 文件?
我看到 SciPy 声称支持读取 .mat 文件,但我没有成功。我安装了 SciPy 0.7.0 版本,但找不到该loadmat()
方法。
解决方案 1:
需要导入,import scipy.io
...
import scipy.io
mat = scipy.io.loadmat('file.mat')
解决方案 2:
和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
解决方案 3:
首先将.mat 文件保存为:
save('test.mat', '-v7')
之后,在 Python 中使用常用loadmat
函数:
import scipy.io as sio
test = sio.loadmat('test.mat')
解决方案 4:
有一个很好的软件包mat4py
,可以很容易地使用
pip install mat4py
使用起来很简单(来自网站):
从 MAT 文件加载数据
该函数loadmat
将存储在 MAT 文件中的所有变量加载到一个简单的 Python 数据结构中,仅使用 Python 的dict
和对象。数字和单元格数组将转换为按行排序的嵌套列表。数组被压缩以消除只有一个元素的数组。生成的数据结构由与JSONlist
格式兼容的简单类型组成。
示例:将 MAT 文件加载到 Python 数据结构中:
from mat4py import loadmat
data = loadmat('datafile.mat')
变量data
是dict
MAT 文件中包含的变量和值。
将 Python 数据结构保存到 MAT 文件
可以使用函数将 Python 数据保存到 MAT 文件中savemat
。数据的结构必须与 相同loadmat
,即它应由简单数据类型组成,例如dict
、list
、str
、int
和float
。
示例:将 Python 数据结构保存到 MAT 文件:
from mat4py import savemat
savemat('datafile.mat', data)
参数data
应为dict
变量。
解决方案 5:
有一个很棒的库可以完成这个任务,叫做:pymatreader
。
只要做如下操作即可:
安装软件包:
pip install pymatreader
导入本包的相关函数:
from pymatreader import read_mat
使用函数读取 matlab 结构:
data = read_mat('matlab_struct.mat')
用于
data.keys()
定位数据的实际存储位置。
密钥通常看起来像:
dict_keys(['__header__', '__version__', '__globals__', 'data_opp'])
。其中data_opp
是存储数据的实际密钥。当然,此密钥的名称可以在不同的文件之间更改。
最后一步-创建数据框:
my_df = pd.DataFrame(data['data_opp'])
就是这样 :)
解决方案 6:
安装 MATLAB 2014b 或更新版本后,可以使用Python 的 MATLAB 引擎:
import matlab.engine
eng = matlab.engine.start_matlab()
content = eng.load("example.mat", nargout=1)
解决方案 7:
读取文件
import scipy.io
mat = scipy.io.loadmat(file_name)
检查 MAT 变量的类型
print(type(mat))
#OUTPUT - <class 'dict'>
字典中的键是MATLAB变量,值是分配给这些变量的对象。
解决方案 8:
将 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)
解决方案 9:
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
)-files
.mat
的结构最适合将数据元素保存在树数据结构中;每个节点都有一个类和子节点
解决方案 10:
scipy.io.loadmat
除了v4(级别 1.0)、v6、v7 到 7.2 的 matfile 和 7.3 格式的 matfile之外h5py.File
,还有另一种类型的 matfile,它们是文本数据格式而不是二进制格式,通常由Octave创建,甚至无法在 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')
解决方案 11:
安装 scipy
pip install scipy
导入 scipy.io.loadmat 模块
from scipy.io import loadmat
annots = loadmat('annotation_0001.mat')
print(annots)
解析 .mat 文件结构
con_list = [[element for element in upperElement] for upperElement in annots['obj_contour']]
使用 Pandas 数据框处理数据
import pandas as pd
newData = list(zip(con_list[0], con_list[1]))
columns = ['obj_contour_x', 'obj_contour_y']
df = pd.DataFrame(newData, columns=columns)
参考:
https: //www.askpython.com/python/examples/mat-files-in-python
解决方案 12:
也可以使用 hdf5 存储库。有关 matlab 版本支持的详细信息请参阅这里的官方文档。
import hdf5storage
label_file = "./LabelTrain.mat"
out = hdf5storage.loadmat(label_file)
print(type(out)) # <class 'dict'>
解决方案 13:
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 文件。
解决方案 14:
在自己努力解决这个问题并尝试了其他库(我不得不说 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)
解决方案 15:
scipy 可以完美地加载 .mat 文件。我们可以使用 get() 函数将其转换为 numpy 数组。
mat = scipy.io.loadmat('point05m_matrix.mat')
x = mat.get("matrix")
print(type(x))
print(len(x))
plt.imshow(x, extent=[0,60,0,55], aspect='auto')
plt.show()
解决方案 16:
使用 Python 上传和读取 mat 文件
在 python 中安装 mat4py。安装成功后我们将获得:
成功安装 mat4py-0.5.0。
从 mat4py 导入 loadmat。
将文件的实际位置保存在变量内。
使用python将mat文件格式加载到数据值
pip install mat4py
from mat4py import loadmat
boston = r"E:Downloadsoston.mat"
data = loadmat(boston, meta=False)
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)