如何正确将维度为(300, 2)的DataFrame保存为同属性的Mat文件?
解决DataFrame保存为Mat文件时维度不符的问题
我来帮你搞定这个问题!你的核心问题在于scipy.io.savemat处理一维数组时的默认行为,以及pandas Series转成values后的结构。
问题原因
你当前的代码遍历DataFrame的每一列(每一列是一个Series),然后取row.values得到的是一维数组(形状为(300,))。savemat在保存一维数组时,默认会把它转成行向量(也就是(1, 300)的形状),这就导致你看到的结果和预期不符。
两种解决方案
根据你的需求,分两种情况处理:
方案1:将整个DataFrame保存为一个(300,2)的矩阵变量
如果你不需要把每一列单独作为变量,而是想要一个和原DataFrame维度完全一致的单一矩阵,直接把整个DataFrame转成二维数组保存即可:
import scipy.io as sio # 假设你的DataFrame名为Info_speed sio.savemat(r"C:\Users\Userprio\Desktop\speed.mat", {'speed_matrix': Info_speed.to_numpy()})
这样在Matlab里打开后,speed_matrix就是一个300行2列的矩阵,和原DataFrame的结构完全对应。
方案2:保留列名作为变量名,每个变量为(300,1)的列向量
如果还是想让每一列单独作为一个变量,但要保持300行的结构,只需要把每一列的一维数组转成二维列向量就行,用reshape(-1, 1)实现:
import scipy.io as sio # 遍历列时,将每个Series的values转成(300,1)的列向量 sio.savemat(r"C:\Users\Userprio\Desktop\speed.mat", {name: row.values.reshape(-1, 1) for name, row in Info_speed.items()})
这样每个列对应的变量都是300行1列的结构,组合起来就和原DataFrame的行/列属性一致了。
小提示
你也可以用row.to_numpy().reshape(-1,1)替代row.values.reshape(-1,1),效果是一样的,to_numpy()是pandas推荐的更清晰的写法。
内容的提问来源于stack exchange,提问作者Bajram_MA
相关产品推荐
相关产品推荐

