使用 Python 读取 .mat 文件

2024-12-25 08:50:00
admin
原创
231
摘要:问题描述:是否可以用 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)

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1124  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   79  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   70  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   82  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   74  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用