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

如何删除二维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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 04:45:40