如何解决Pandas加载MATLAB转CSV报Must pass 2-d input错误
报错原因
pandas.DataFrame 为二维表结构,仅支持传入二维数组或结构化数据。你从MATLAB文件读取的变量是形状为(170, 7, 3, 3)的四维数组,直接传入会触发维度不匹配报错。
解决方案
根据实际导出需求选择对应方案即可:
方案1:全量数据按样本展平导出(适用绝大多数场景)
如果数组第一维(长度170)为独立样本/观测记录,剩余三维为特征维度,可直接将高维数组重构为二维结构,不会丢失任何原始数值:
from scipy.io import loadmat import pandas as pd import numpy as np data = loadmat(r"/Users/a/desktop/file.mat") x = data["file"] # 以第一维为行,剩余维度展平为特征列,输出形状为(170, 63) # 若导出后数值排布和MATLAB中不一致,给reshape加order="F"参数适配MATLAB列优先存储规则 x_2d = x.reshape(x.shape[0], -1) df = pd.DataFrame(x_2d) # 可选:给特征列添加维度索引标识,按需修改列名即可 df.columns = [f"dim2_{i}_dim3_{j}_dim4_{k}" for i in range(7) for j in range(3) for k in range(3)] df.to_csv(r"/Users/a/desktop/data.csv", index=False)
方案2:导出带维度索引的长表
如果需要保留所有维度的索引信息(比如四个维度分别对应被试、频段、通道、实验条件等业务属性),可生成长表格式,每一行对应一个数值和它所属的四个维度标签,方便后续筛选统计:
from scipy.io import loadmat import pandas as pd import numpy as np data = loadmat(r"/Users/a/desktop/file.mat") x = data["file"] # 生成所有位置的维度索引 d1, d2, d3, d4 = np.indices(x.shape) df = pd.DataFrame({ "dim1": d1.flatten(), "dim2": d2.flatten(), "dim3": d3.flatten(), "dim4": d4.flatten(), "value": x.flatten(order="F") # 适配MATLAB存储顺序可加order="F" }) # 可将列名替换为实际业务含义,比如把dim1改为subject_id df.to_csv(r"/Users/a/desktop/data_long.csv", index=False)
方案3:提取指定切片导出
如果不需要全量数据,仅需要四维数组中某一个二维切片,先做维度切片再重构为二维结构即可,例如提取第一个样本对应的三维子数组,展平后导出:
from scipy.io import loadmat import pandas as pd import numpy as np data = loadmat(r"/Users/a/desktop/file.mat") x = data["file"] # 提取第0个样本的子数组,按需修改索引值即可 x_slice = x[0, :, :, :].reshape(7, -1, order="F") df = pd.DataFrame(x_slice) df.to_csv(r"/Users/a/desktop/data_slice.csv", index=False)
注意事项
- MATLAB采用列优先(Fortran order)存储,numpy默认采用行优先(C order)存储,如果reshape后发现数值排布和MATLAB中不一致,给
reshape、flatten操作加上order="F"参数即可对齐 - 导出CSV时建议传入
index=False参数,避免pandas自动生成的行索引作为冗余列写入文件
内容的提问来源于stack exchange,提问作者user19542635
相关产品推荐
相关产品推荐

