Python数组元素移除报错求助:神经网络验证集划分问题
解决数组拆分时的索引越界问题
嘿,我完全懂你现在的困扰——我当初刚学Python处理数据集拆分的时候也踩过一模一样的坑!你遇到的索引越界,本质是因为在正序遍历数组时移除元素,会导致数组长度不断缩短,后面的索引就会超出新的数组范围。而且你最后那段移除逻辑也有问题:one_more[i] == string_arr是把单个元素和整个数组做比较,永远不会成立,所以根本删不掉元素。
下面给你几种简单可靠的解决方案,从基础手动实现到更简洁的写法都有:
方法1:倒序遍历移除元素
既然正序遍历会因为数组变短导致索引错位,那我们反过来,从数组的最后一个元素往前遍历。这样就算移除前面的元素,后面(实际是当前遍历位置之前)的索引不会受到影响:
english_list = open('file') string_arr = [] target_arr = [] for word in english_list.readlines(): word = word[:-1].lower() if len(word) == 6: string_arr.append(word) target_arr.append(0) print("原数组长度:", len(string_arr)) test_arr = [] # 先收集验证集 for i in range(len(string_arr)): if i % 5 == 0: test_arr.append(string_arr[i]) # 倒序遍历原数组,移除验证集元素 for i in range(len(string_arr)-1, -1, -1): if i % 5 == 0: del string_arr[i] # 别忘了对应的target_arr也要同步移除,保证数据对应关系 del target_arr[i] print("验证集长度:", len(test_arr)) print("训练集长度:", len(string_arr))
方法2:直接拆分训练集和验证集(更推荐)
其实完全不需要先把所有元素放进主数组再移除,我们可以在收集元素的时候就直接分配到训练集和验证集里,逻辑更清晰,也不会有索引问题:
english_list = open('file') train_arr = [] train_target = [] test_arr = [] test_target = [] for idx, word in enumerate(english_list.readlines()): word = word[:-1].lower() if len(word) == 6: # 每第5个元素(索引0,5,10...)放到验证集 if idx % 5 == 0: test_arr.append(word) test_target.append(0) else: train_arr.append(word) train_target.append(0) print("验证集长度:", len(test_arr)) print("训练集长度:", len(train_arr))
方法3:用列表推导式生成新的训练集
如果已经有了完整的string_arr和test_arr,也可以直接用列表推导式筛选出不在验证集里的元素(注意:如果数组里有重复元素,这个方法可能会误删,适合元素唯一的场景):
# 假设已经收集好了test_arr string_arr = [word for word in string_arr if word not in test_arr] target_arr = [target for idx, target in enumerate(target_arr) if idx %5 !=0]
另外要提醒你:处理数据集的时候,一定要同步处理string_arr和target_arr,不然两者的对应关系会错乱,训练模型的时候就会出问题哦。
内容的提问来源于stack exchange,提问作者Sam Dean
相关产品推荐
相关产品推荐

