NumPy ND数组如何按值删除指定行 解决返回空列表问题
问题根因
原代码返回空列表,是np.where(array == item)的匹配逻辑不符合预期:逐元素相等判断会通过广播匹配所有值为1的元素位置,而非定位「整行内容与目标值完全一致」的行索引,传入np.delete的索引参数错误,最终输出异常。
正确实现
删除整行内容完全匹配目标值的行,需要先逐行校验整行是否与目标值完全相等,拿到匹配行的位置后再做筛选/删除,代码如下:
import numpy as np def delete_item(array, item): # 逐行判断所有元素是否与目标item完全匹配 match_row = np.all(array == item, axis=1) # 筛选出不匹配的行即为结果 return array[~match_row] a = np.array([[1, 1, 1], [85, 32, 531], [78, 91, 79]]) new_array = delete_item(a, [1, 1, 1]) print(new_array)
输出结果
运行后可得到预期输出:
[[ 85 32 531] [ 78 91 79]]
逻辑说明
array == item会逐元素做相等判断,返回和原数组维度一致的布尔数组,标记每个位置的元素是否与目标item对应位置的值相等np.all(..., axis=1)沿列方向做全真判断,只有整行所有元素都和目标值匹配时,才会将该行标记为True(即待删除行)- 对布尔掩码取反后直接索引数组,即可得到所有保留行,逻辑比直接调用
np.delete更直观,也不会出现索引错位问题。
内容的提问来源于stack exchange,提问作者Uncle Bob
相关产品推荐
相关产品推荐

