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

为何处理多DataFrame测试集时,首次迭代的testX/testy为3D数组?

问题原因与解决方法

问题原因

首次迭代生成3D数组的核心原因是数据结构解析逻辑的差异:

  • 第一次循环中,temp_a是由24个长度为96的pandas Series组成的列表,将其添加到testX后,testX为[temp_a]。numpy解析这个嵌套列表时,会把每个Series视为一维数组,因此整体形成(1,24,96)的三维形状。
  • 后续迭代添加的temp_a对应的DataFrame行数与第一个不同,numpy无法将所有子元素统一为三维数组结构,只能将testX降级为二维的object数组,形状变为(R,24),每个元素是独立的、长度不同的Series。

解决方法

不要逐个提取列再拼接,直接一次性提取目标列并转为numpy数组,这样每个temp_a会是一个二维数组(行数×特征数),结构更清晰:

修改create_testxy函数的核心循环部分:

def create_testxy(dataset,n_test):
    train,test= train_test_split(dataset, n_test)
    p = skip_a_b_c(48,1,3,3)
    q = skip_a_b_c(48,4,4,2)
    testX = []
    testy = []
    for testset in test:
        # 直接提取目标列并转为numpy数组
        temp_a = testset.iloc[:, p].values
        temp_b = testset.iloc[:, q].values
        testX.append(temp_a)
        testy.append(temp_b)
        
        print('TEST X SHAPE IS',np.shape(testX))
        print('TESTY SHAPE IS', np.shape(testy))
    return (train, testX, testy)

修改后,首次迭代的testX形状会变为(1, 96, 24)(对应1个测试集,96行样本,24个特征),后续迭代的形状会是(R,),其中每个元素是对应测试集的二维数组(行数×特征数)。

如果需要统一所有测试集的样本长度,可以根据业务需求对短的DataFrame填充补值(如0),或对长的DataFrame做截断处理。

另外,你的train_test_split函数可以简化为切片操作,更简洁高效:

def train_test_split(dataset, n_test):
    return dataset[:-n_test], dataset[-n_test:]

内容的提问来源于stack exchange,提问作者KN202

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:35:19