Python 读取 .mat 文件深度指南:解锁 MATLAB 数据互操作性84


在科学计算、工程仿真以及数据分析的诸多领域,MATLAB 凭借其强大的数值计算能力和友好的可视化界面,积累了大量的用户和数据资产。MATLAB 生成的专属数据文件通常以 .mat 为扩展名。然而,在日益普及的 Python 生态系统中,特别是当我们需要利用 Python 的丰富库(如 NumPy、Pandas、SciPy、Scikit-learn 等)进行后续数据处理、机器学习或可视化时,如何高效、准确地读取这些 .mat 文件成为了一个常见而关键的需求。

本文将作为一份专业的指南,深入探讨 Python 读取 .mat 文件的各种方法、技巧以及常见问题解决方案。我们将主要聚焦于 模块,并兼顾对新版 HDF5 格式 .mat 文件的处理。

1. 为什么需要在 Python 中读取 .mat 文件?

尽管 MATLAB 和 Python 都是科学计算领域的强大工具,但它们各有侧重和优势。在以下场景中,你可能会发现需要在 Python 中读取 .mat 文件:
数据互操作性: 与使用 MATLAB 的团队或个人共享数据。
统一工作流: 将 MATLAB 生成的数据整合到基于 Python 的数据分析、机器学习或深度学习管道中。
资源限制: 在没有 MATLAB 环境的服务器或机器上处理数据。
利用 Python 库: 充分利用 Python 庞大而活跃的科学计算库生态系统,例如更高效的深度学习框架(TensorFlow, PyTorch)、更专业的统计建模工具或更灵活的数据可视化库。

2. 核心工具:

Python 生态系统中的 SciPy 库是科学计算的核心。其 模块提供了与多种数据格式(包括 MATLAB、IDL、Fortran 等)进行交互的功能。其中,loadmat 函数是读取 .mat 文件的主要工具。

2.1 安装 SciPy


如果你还没有安装 SciPy,可以通过 pip 轻松安装:pip install scipy numpy

2.2 基本用法


函数会将 .mat 文件中的所有变量加载到一个 Python 字典中,其中字典的键是 MATLAB 变量的名称,值是对应的 NumPy 数组或结构体。

首先,我们创建一个简单的 MATLAB `.mat` 文件作为示例。你可以运行以下 MATLAB 代码来生成它:% 创建一个简单的 .mat 文件
data_scalar = 123;
data_vector = [1 2 3 4 5];
data_matrix = [1 2; 3 4];
data_string = 'Hello MATLAB!';
data_complex = 1 + 2i;
% 创建一个结构体
= 'Alice';
= 30;
= [90 85 92];
% 创建一个单元格数组
myCellArray = {1, 'two', [3; 4]};
save('', ...
'data_scalar', 'data_vector', 'data_matrix', 'data_string', 'data_complex', ...
'myStruct', 'myCellArray');
fprintf(' created successfully.');

现在,我们用 Python 读取它:import as sio
import numpy as np
# 假设 存在于当前目录下
mat_contents = ('')
# print(mat_contents) # 可以打印整个字典查看内容
# 访问变量
scalar_data = mat_contents['data_scalar']
vector_data = mat_contents['data_vector']
matrix_data = mat_contents['data_matrix']
string_data = mat_contents['data_string']
complex_data = mat_contents['data_complex']
print(f"标量数据 (scalar_data): {scalar_data}, 类型: {type(scalar_data)}")
print(f"向量数据 (vector_data): {vector_data}, 类型: {type(vector_data)}")
print(f"矩阵数据 (matrix_data): {matrix_data}, 类型: {type(matrix_data)}")
print(f"字符串数据 (string_data): {string_data}, 类型: {type(string_data)}")
print(f"复数数据 (complex_data): {complex_data}, 类型: {type(complex_data)}")
# 注意:字符串在MATLAB中通常是字符数组,loadmat会将其转换为NumPy数组,
# 如果是单个字符串,通常是 shape 为 (1, N) 的二维数组,需要进一步处理
if == 'U': # Universal string
print(f"处理后的字符串数据: {()}") # .item() 提取单个元素
else: # If it's bytes or other array type
print(f"处理后的字符串数据: {()[0]}") # Or similar method
# MATLAB 的复数会被转换为 Python 的复数类型
print(f"复数数据的实部: {}, 虚部: {}")

输出解读:
loadmat 返回一个字典。
字典中除了用户定义的变量外,还会包含一些 MATLAB 内部的元数据,通常以 __ 开头,例如 __header__、__version__、__globals__。在使用时,我们通常会忽略这些键。
MATLAB 的数值类型(标量、向量、矩阵)会被自动转换为 NumPy 的 ndarray。
MATLAB 的字符串(字符数组)通常会被加载为 NumPy 的字符数组(例如 dtype='

2025-10-23


上一篇:Python字符串日期提取:从基础到高级,掌握多种高效截取方法

下一篇:Python 风格迁移:从 Gatys 经典到实时应用的全方位指南