如何在Python中访问指定.mat文件内的数组内容?
解决.mat文件数组访问问题
我来帮你搞定这个读取.mat文件并访问数组内容的问题!下面是一步步的实用解决方案:
1. 先获取目标.mat文件
首先要注意:scipy.io.loadmat没办法直接读取远程URL的文件,所以你需要先把nir_shootout_2002.mat下载到Python脚本所在的工作目录(或者后续用完整文件路径读取)。
2. 读取文件并定位数据变量
用scipy.io.loadmat读取文件后,返回的是一个字典——MATLAB里的所有变量名会作为字典的键,数组内容对应的值。你可以先打印所有键,快速定位到你需要的数据:
import scipy.io as spio import numpy as np import matplotlib.pyplot as plt # 读取本地的.mat文件 mat = spio.loadmat('nir_shootout_2002.mat') # 查看所有键(__开头的是MATLAB元数据,真正的业务数据是其他键) print("文件内的所有变量:", mat.keys())
运行后你会看到类似dict_keys(['__header__', '__version__', '__globals__', 'X', 'y', 'wavelengths'])的输出,其中X、y这类就是你要访问的数组变量。
3. 直接访问数组内容
找到目标键后,直接通过字典索引就能拿到对应的numpy数组,之后就可以像操作普通numpy数组一样处理:
# 示例:访问名为X的核心数据数组 data_array = mat['X'] # 查看数组的形状(行数、列数) print("数组形状:", data_array.shape) # 访问数组的具体元素(注意numpy数组是0起始索引) print("第一行第一列的元素:", data_array[0, 0]) # 切片获取部分数据,比如前10行的所有列 data_subset = data_array[:10, :]
4. 修正你的嵌套打印函数
你写的递归打印函数有两个小问题:Python 3里dict.iteritems()已经改成dict.items(),而且代码没有写完。这里给你修正后的版本,可以清晰打印.mat文件的所有结构,方便你排查内容:
def print_mat_nested(d, indent=0, nkeys=0): if nkeys > 0: # 只打印前nkeys个键,避免输出过多内容 d = {k: d[k] for k in list(d.keys())[:nkeys]} if isinstance(d, dict): for key, value in d.items(): print('\t' * indent + f"🔑 键名: {key}") print_mat_nested(value, indent + 1) elif isinstance(d, np.ndarray): print('\t' * indent + f"📊 数组形状: {d.shape}") # 打印少量元素预览,避免刷屏 if d.size <= 10: print('\t' * indent + f"内容: {d}") else: print('\t' * indent + f"前5个元素: {d.flatten()[:5]}...") else: print('\t' * indent + f"📝 值: {d}") # 调用函数查看整个.mat文件的结构 print_mat_nested(mat)
小提示
- 如果文件不在当前工作目录,可以用完整路径读取,比如
spio.loadmat('/Users/xxx/Downloads/nir_shootout_2002.mat') - MATLAB的矩阵在numpy里是二维数组,用
array[row, col]的格式访问元素更贴合MATLAB的使用习惯,当然array[row][col]也能生效。
内容的提问来源于stack exchange,提问作者kaushal
相关产品推荐
相关产品推荐

