如何使用NumPy从数组中删除指定子数组?
NumPy 删除数组中指定子数组的正确方法
错误原因分析
np.delete(points, front_yard)报错np.delete的第二个参数要求传入索引值,而非要删除的元素内容。你传入的front_yard是[(25,0), (75,0)],会被当成索引25、0、75、0处理,但points展平后只有16个元素(索引范围0-15),因此索引25越界触发IndexError。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
相关产品推荐
相关产品推荐

