使用scipy加载MATLAB三维数组转NumPy时生成0维数组引发索引错误
问题根因
scipy.io.loadmat读取.mat文件的返回值是Python字典结构,并非直接的NumPy数组:字典的每个键对应.mat文件内存储的MATLAB变量名,键对应的值,才是该MATLAB变量转换得到的NumPy数组。
原代码的核心操作存在偏差:直接将整个字典对象传入np.array()构造器生成数组时,NumPy不会自动解析字典内部的键值对结构,只会把传入的字典当做一个零维的通用Python对象存储。最终得到的数组维度始终为0,可通过matrix.shape验证,输出结果为(),也就是零维数组,内部存储的是字典对象的引用,而非字典中保存的数值矩阵,自然无法支持三维索引操作,触发维度不匹配的报错。
修正方案
- 读取.mat文件后,首先遍历字典的所有键,过滤掉.mat文件自动附加的元数据键(
__header__、__version__、__globals__),定位到你存储的三维矩阵对应的实际变量名。
可通过以下代码排查文件内的所有变量:import scipy.io import numpy as np mat = scipy.io.loadmat('2021.01.25.FC.mat') print(mat.keys()) - 定位到目标变量名后,直接从字典中取出对应的值作为NumPy数组,不要对整个字典做NumPy类型转换。
举例:如果排查发现三维矩阵的变量名为fc_result,正确的取数逻辑为:# 直接读取字典中对应变量的数组值 matrix = mat['fc_result'] # 验证数组维度,确认和MATLAB内的矩阵维度匹配 print(matrix.shape) # 可正常执行三维索引操作 x = matrix[2, 2, 2] - 特殊场景处理:如果打印键列表后找不到目标业务变量,说明该.mat文件是MATLAB v7.3及以上版本导出的(底层采用HDF5存储格式),
scipy.io.loadmat无法解析这类文件,需要换用h5py库读取对应的数据块。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

