Python按24:6拆分训练测试集时列表长度异常膨胀问题
数据集拆分数据量异常膨胀问题修正
问题描述
需要将单列表元素拆分追加到训练、测试两组共四个列表中,预期逻辑为:按遍历顺序每30个元素为一组,前24个元素及对应标签追加到train_imgs、train_lbs,后续6个元素及对应标签追加到test_imgs、test_lbs,循环完成全量数据拆分。
实际运行后训练集与测试集总长度达到9000,远大于初始array_resized的300条原始数据长度。
相关原始代码
拆分逻辑代码
train_imgs = [] train_lbs = [] test_imgs = [] test_lbs = [] i = 0 j = 0 print(len(array_resized)) for i in range(len(array_resized)): for j in range(24): train_imgs.append(array_resized[i]) train_lbs.append(ar_label[i]) j = j+1 j = 0 for j in range(6): test_imgs.append(array_resized[i]) test_lbs.append(ar_label[i]) j = j+1 j = 0
数据集预处理代码
array_0 = [cv2.imread(file, cv2.IMREAD_GRAYSCALE) for file in glob.glob("/content/imgs_3/0*")] ar_label0 = ['0' for file in array_0] array_1 = [cv2.imread(file, cv2.IMREAD_GRAYSCALE) for file in glob.glob("/content/imgs_3/1*")] ar_label1 = ['1' for file in array_1] # 按相同规则生成array_2到array_9、ar_label2到ar_label9 array_all = array_0+array_1+array_2+array_3+array_4+array_5+array_6+array_7+array_8+array_9 array_resized = [cv2.resize(file, (28,28), interpolation=cv2.INTER_LINEAR) for file in array_all]
问题原因
- 核心逻辑错误:外层循环遍历全部300条数据时,对每一条数据都在内层循环24次追加到训练集、循环6次追加到测试集,单条数据被重复追加30次,总数据量为
300*(24+6)=9000,和异常表现完全匹配。 - 冗余无效代码:
for j in range(x)语法会自动迭代j值,循环内手动写j = j+1、循环末尾重置j=0没有任何实际作用,属于多余代码。 - 逻辑偏差:没有按30的步长做分块处理,完全违背了“每30个元素为一组拆分”的需求。
- 预处理疏漏:现有预处理代码仅拼接了图像数组
array_all,未按相同顺序拼接ar_label0到ar_label9生成总标签列表ar_label,直接运行会报变量未定义错误。
修正后代码
train_imgs = [] train_lbs = [] test_imgs = [] test_lbs = [] # 先补全标签列表拼接,顺序和array_all完全一致 ar_label = ar_label0 + ar_label1 + ar_label2 + ar_label3 + ar_label4 + ar_label5 + ar_label6 + ar_label7 + ar_label8 + ar_label9 # 按步长30遍历,每次取连续30个元素为一个拆分块 for block_start in range(0, len(array_resized), 30): # 当前块前24个加入训练集 for idx in range(block_start, block_start + 24): if idx >= len(array_resized): # 兼容最后一组不足30个的边界情况 break train_imgs.append(array_resized[idx]) train_lbs.append(ar_label[idx]) # 当前块剩余6个加入测试集 for idx in range(block_start + 24, block_start + 30): if idx >= len(array_resized): break test_imgs.append(array_resized[idx]) test_lbs.append(ar_label[idx]) # 拆分结果校验 print(f"训练集长度:{len(train_imgs)}, 测试集长度:{len(test_imgs)}, 总数据量:{len(train_imgs)+len(test_imgs)}")
拆分结果说明:300条原始数据按规则拆分后,训练集共240条、测试集共60条,总长度和原始数据量完全一致,符合预期。
内容的提问来源于stack exchange,提问作者charles
相关产品推荐
相关产品推荐

