如何删除二维NumPy数组索引1列重复行并解决索引越界报错
问题场景
现有如下二维NumPy数组:
import numpy as np arr = np.array([[1,2], [2,2], [3,2], [4,2], [5,3]])
需求为删除所有索引为1的列中,值与前一行同列值重复的行,预期输出结果:
np.array([[1,2], [5,3]])
原实现在遍历过程中直接删除数组元素,触发索引越界报错:
for x in range(0, len(arr)): if arr[x][1] == arr[x-1][1]: arr = np.delete(arr, x, 0) # 报错输出 >>> IndexError: index 3 is out of bounds for axis 0 with size 2
错误原因
range(0, len(arr))在循环开始时就按照原始数组长度生成了固定的索引序列,但每次调用np.delete都会返回长度更短的新数组,后续循环的索引值会超过新数组的实际长度,直接触发越界。- 边遍历边修改原数组本身就会导致索引错位,哪怕不触发越界,也会出现漏判、错判行的问题。
- 原循环从索引0开始取值比较,
x=0时x-1 = -1会取到数组最后一行做对比,本身逻辑就不符合需求。
实现方案
优先使用NumPy原生的向量化操作,先构造需要保留行的布尔掩码,再一次性完成筛选,性能最好也不会出现索引问题:
# 提取目标列(索引为1的列) target_col = arr[:, 1] # 构造保留掩码:首行默认保留,后续行仅保留与上一行目标列值不相等的行 keep_mask = np.r_[True, target_col[1:] != target_col[:-1]] # 一次性筛选得到结果 result = arr[keep_mask]
执行后result输出与预期完全一致:
array([[1, 2], [5, 3]])
如果习惯用循环逻辑实现,不要在遍历过程中修改原数组,先收集所有需要删除的行索引,遍历完原始数组后再统一执行删除操作:
delete_index = [] # 从第二行(索引1)开始遍历,和前一行做对比 for i in range(1, len(arr)): if arr[i, 1] == arr[i-1, 1]: delete_index.append(i) result = np.delete(arr, delete_index, axis=0)
内容的提问来源于stack exchange,提问作者testerboy22
相关产品推荐
相关产品推荐

