如何将含struct的Matlab .mat文件中truth数据正确加载到Python数组?
解决Matlab .mat结构体字段加载到Python的维度异常问题
Matlab生成的data.mat文件包含名为Filter_Results的结构体,其中truth字段是维度为(7198×3)的位置数据。使用以下Python代码加载时,输出的truth.shape为(1,1),不符合预期的(7198,3):
import scipy.io as spio import numpy as np filename1 = spio.loadmat('data.mat') filter_results = filename1['Filter_Results'] truth = np.matrix((filter_results['truth'][:,:])) print(truth.shape)
问题原因
scipy.io.loadmat加载Matlab结构体时,会将结构体包装在一个**(1,1)的二维numpy数组**中(对应Matlab中结构体数组的存储形式)。直接访问filter_results['truth']时,实际是从这个(1,1)数组的每个元素中取字段,结果仍然是嵌套的(1,1)数组,而非原始的二维数据。
解决方案
先通过[0,0]索引取出(1,1)数组中实际的结构体对象,再访问truth字段:
修改后的代码:
import scipy.io as spio import numpy as np # 加载mat文件 filename1 = spio.loadmat('data.mat') # 取出结构体数组中的实际结构体对象 filter_results = filename1['Filter_Results'][0, 0] # 直接获取truth字段,得到原始维度的数组 truth = filter_results['truth'] # 可选:如果需要转成matrix类型(numpy数组更推荐) # truth = np.matrix(filter_results['truth']) print(truth.shape) # 输出 (7198, 3)
执行上述代码后,truth.shape会输出预期的(7198, 3)。如果不需要matrix类型,直接使用numpy数组即可(filter_results['truth']本身就是numpy.ndarray类型)。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

