使用 Python 读取 .mat 文件

2024-12-25 08:50:00
admin
原创
320
摘要:问题描述:是否可以用 Python 读取二进制 MATLAB .mat 文件?我看到 SciPy 声称支持读取 .mat 文件,但我没有成功。我安装了 SciPy 0.7.0 版本,但找不到该loadmat()方法。解决方案 1:需要导入,import scipy.io...import scipy.io m...

问题描述:

是否可以用 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')

变量datadictMAT 文件中包含的变量和值。

将 Python 数据结构保存到 MAT 文件

可以使用函数将 Python 数据保存到 MAT 文件中savemat。数据的结构必须与 相同loadmat,即它应由简单数据类型组成,例如dictliststrintfloat

示例:将 Python 数据结构保存到 MAT 文件:

from mat4py import savemat

savemat('datafile.mat', data)

参数data应为dict变量。

解决方案 5:

有一个很棒的库可以完成这个任务,叫做:pymatreader

只要做如下操作即可:

  1. 安装软件包:pip install pymatreader

  2. 导入本包的相关函数:from pymatreader import read_mat

  3. 使用函数读取 matlab 结构:data = read_mat('matlab_struct.mat')

  4. 用于data.keys()定位数据的实际存储位置。

  • 密钥通常看起来像:dict_keys(['__header__', '__version__', '__globals__', 'data_opp'])。其中data_opp是存储数据的实际密钥。当然,此密钥的名称可以在不同的文件之间更改。

  1. 最后一步-创建数据框: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 文件并注释每一行来找出每个字节的含义。

  • 使用类保存每个数据元素(例如miCOMPRESSEDmiMATRIXmxDOUBLEmiINT32

  • -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:

  1. 安装 scipy

pip install scipy

  1. 导入 scipy.io.loadmat 模块

     from scipy.io import loadmat
      annots = loadmat('annotation_0001.mat')
      print(annots)
  1. 解析 .mat 文件结构

   con_list = [[element for element in upperElement] for upperElement in annots['obj_contour']]
  1. 使用 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 文件

  1. 在 python 中安装 mat4py。安装成功后我们将获得:

  2. 成功安装 mat4py-0.5.0。

  3. 从 mat4py 导入 loadmat。

  4. 将文件的实际位置保存在变量内。

  5. 使用python将mat文件格式加载到数据值

pip install mat4py

from mat4py import loadmat

boston = r"E:Downloadsoston.mat"
data = loadmat(boston, meta=False)

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2500  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1541  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   16  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   23  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   26  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用