如何用Numpy掩码过滤掉值4出现在索引10及之前的数组行
使用Numpy掩码过滤指定条件的行
需求说明
过滤掉数组中值4出现在索引0~10范围内的行,保留以下两类行:
- 行中没有值4
- 值4出现在索引10之后的位置
实现步骤
1. 构造示例数组(模拟问题中的输入)
import numpy as np # 构造包含不同位置4的示例数组 arr = np.array([ [1, 4, 33, 28, 9, 22, 5, 6, 7, 8, 9, 10], # 4在索引1(需过滤) [3, 11, 1, 25, 45, 14, 4, 5, 6, 7, 8, 9], # 4在索引6(需过滤) [3, 11, 1, 21, 23, 5, 6, 7, 8, 9, 10, 4], # 4在索引11(需保留) [20, 6, 27, 43, 15, 14, 5, 6, 7, 8, 9, 10], # 无4(需保留) [27, 6, 39, 37, 17, 2, 3, 4, 5, 6, 7, 8], # 4在索引7(需过滤) [3, 11, 8, 27, 35, 32, 5, 6, 7, 8, 9, 4] # 4在索引11(需保留) ], dtype=np.int32)
2. 生成过滤掩码并应用
# 生成掩码:前11个元素(索引0-10)不含4的行标记为True(保留) mask = ~(arr[:, :11] == 4).any(axis=1) # 应用掩码得到过滤后的数组 filtered_arr = arr[mask]
代码解释
arr[:, :11]:提取每行的前11个元素(对应索引0到10的范围)(arr[:, :11] == 4):生成布尔数组,标记前11个元素中等于4的位置.any(axis=1):按行聚合判断,只要该行前11个元素存在4,返回True(表示需要过滤)~:对结果取反,得到保留行的掩码:前11个元素无4 →True,有4 →False
验证结果
运行以下代码查看过滤后的数组:
print(filtered_arr)
输出:
[[ 3 11 1 21 23 5 6 7 8 9 10 4] [20 6 27 43 15 14 5 6 7 8 9 10] [ 3 11 8 27 35 32 5 6 7 8 9 4]]
内容的提问来源于stack exchange,提问作者DS Park
相关产品推荐
相关产品推荐

