You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确将维度为(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 08:34:11