如何用布尔索引筛选数组/列表元素,无需for循环且支持二维numpy数组行筛选
一维数据过滤方案
分两种场景实现,均无显式for循环:
普通Python列表场景
使用itertools内置的compress方法直接按标志筛选,逻辑简洁效率高:
from itertools import compress my_list = [1, 2, 3, 4, 5] flag_list = [1, 0, 1, 1, 0] new_list = list(compress(my_list, flag_list)) # 输出结果:[1, 3, 4]
也可以用列表推导式(语法中的for属于推导式隐式循环,执行效率远高于手动写for循环append逻辑):
new_list = [x for x, flag in zip(my_list, flag_list) if flag]
numpy一维数组场景
直接用numpy的布尔索引矢量化操作,无需任何循环:
import numpy as np my_arr = np.array(my_list) flag_arr = np.array(flag_list, dtype=bool) # 将0/1标志转为布尔类型 new_arr = my_arr[flag_arr]
二维numpy数组按标志剔除行方案
同样使用布尔索引实现,筛选逻辑和一维场景完全兼容,只需在索引时指定行维度即可:
import numpy as np # 示例二维数组,共5行2列 arr_2d = np.array([ [1, 2], [3, 4], [5, 6], [7, 8], [9, 10] ]) flag_list = [1, 0, 1, 1, 0] flag_arr = np.array(flag_list, dtype=bool) # 保留flag为1的行 new_2d_arr = arr_2d[flag_arr] # 等价于 arr_2d[flag_arr, :],写法更清晰 # 如果需要反过来剔除flag为1的行,保留flag为0的行,对布尔数组取反即可 new_2d_arr = arr_2d[~flag_arr]
内容的提问来源于stack exchange,提问作者Kadaj13
相关产品推荐
相关产品推荐

