为何numpy.delete处理布尔数组时总是多删除一个元素?
为什么
numpy.delete用布尔数组时结果不符合预期? 这问题我刚学numpy的时候也踩过一模一样的坑!核心原因是你误解了np.delete第二个参数的用法——它不支持直接传入布尔掩码来指定要删除的元素,这是很多新手容易搞错的点。
先拆解你遇到的两种情况:
当你传入
bb = np.array([0,0,0,0,0,0,0,0], dtype='bool')时:
numpy会把布尔数组强制转换成整数数组,也就是[0,0,0,0,0,0,0,0]。而np.delete的第二个参数obj接受的是要删除的索引位置(单个索引、索引数组或切片),所以这里它会删除所有索引为0的元素(虽然重复传了多次,但结果还是只删一次),原数组[1,2,3,...8]去掉索引0的元素1,就得到了你看到的array([2, 3, 4, 5, 6, 7, 8])。当你改成
bb = np.array([1,0,0,0,0,0,0,0], dtype='bool')时:
布尔数组转成整数数组是[1,0,0,0,0,0,0,0],这时候np.delete会删除索引1和索引0的元素(因为数组里包含这两个索引值),原数组去掉1(索引0)和2(索引1),就得到了array([3, 4, 5, 6, 7, 8])。
正确的布尔掩码删除方式
如果你想用布尔数组来筛选/删除元素,直接用numpy的布尔索引就可以了,这是numpy里处理这类需求的标准方式:
import numpy as np aa = np.array([1,2,3,4,5,6,7,8]) # 情况1:全False,保留所有元素 bb = np.array([0,0,0,0,0,0,0,0], dtype='bool') result = aa[~bb] # ~是取反操作,把False转成True,True转成False print(result) # 输出 array([1, 2, 3, 4, 5, 6, 7, 8]) # 情况2:第一个元素为True,删除它 bb = np.array([1,0,0,0,0,0,0,0], dtype='bool') result = aa[~bb] print(result) # 输出 array([2, 3, 4, 5, 6, 7, 8])
再补充下np.delete的正确用法
np.delete的设计是通过索引位置来删除元素,比如:
- 删除单个索引:
np.delete(aa, 0)→ 去掉第一个元素 - 删除多个索引:
np.delete(aa, [0,1])→ 去掉前两个元素 - 删除切片:
np.delete(aa, slice(0,2))→ 同样去掉前两个元素
如果非要用np.delete配合布尔掩码,你可以先把布尔掩码转换成索引数组:
# 找到所有为True的索引,然后删除这些位置的元素 indices_to_delete = np.where(bb)[0] result = np.delete(aa, indices_to_delete)
内容的提问来源于stack exchange,提问作者f. c.
相关产品推荐
相关产品推荐

