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

如何使用NumPy从数组中删除指定子数组?

NumPy 删除数组中指定子数组的正确方法

错误原因分析

  1. np.delete(points, front_yard)报错
    np.delete的第二个参数要求传入索引值,而非要删除的元素内容。你传入的front_yard是[(25,0), (75,0)],会被当成索引25、0、75、0处理,但points展平后只有16个元素(索引范围0-15),因此索引25越界触发IndexError。

  2. np.where(coords == front_yard)结果不符合预期
    这个逐元素比较逻辑是判断points中单个元素是否等于front_yard里的任意元素,而非匹配整个子数组(行)。它会把所有值为25或0的元素位置找出来删除,导致结果并非你想要的“删除指定两行”。

正确实现方法

要实现删除points中与front_yard完全匹配的子数组(行),核心是匹配整个行而非单个元素,以下是两种高效实现方式:

方法1:布尔索引过滤

import numpy as np

points = np.array([(25, 0), (0, 25), (0, 75), (25, 100), (75, 100), (100, 75), (100, 25), (75, 0)])
front_yard = np.array([(25, 0), (75, 0)])

# 生成布尔掩码:标记哪些行不在front_yard中
mask = ~np.isin(points, front_yard).all(axis=1)
new_coords = points[mask]
  • np.isin(points, front_yard):逐元素判断是否在front_yard的元素集合中
  • .all(axis=1):确保整行的所有元素都匹配(即整个子数组与front_yard中的某一行完全一致)
  • ~取反后得到要保留的行的掩码,直接过滤即可

方法2:通过索引删除

import numpy as np

points = np.array([(25, 0), (0, 25), (0, 75), (25, 100), (75, 100), (100, 75), (100, 25), (75, 0)])
front_yard = np.array([(25, 0), (75, 0)])

# 获取需要删除的行索引
delete_indices = np.where(np.isin(points, front_yard).all(axis=1))[0]
new_coords = np.delete(points, delete_indices, axis=0)
  • 先通过np.where找到所有匹配行的索引,再用np.delete指定axis=0(按行删除)

备选方法(适用于小数组)

如果数组规模较小,也可以用列表推导结合np.array_equal实现:

import numpy as np

points = np.array([(25, 0), (0, 25), (0, 75), (25, 100), (75, 100), (100, 75), (100, 25), (75, 0)])
front_yard = np.array([(25, 0), (75, 0)])

# 筛选出不匹配front_yard中任何子数组的行
keep_indices = [i for i, p in enumerate(points) if not any(np.array_equal(p, fy) for fy in front_yard)]
new_coords = points[keep_indices]

内容的提问来源于stack exchange,提问作者user3132616

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 00:00:57