为何处理多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
相关产品推荐
相关产品推荐

