Skip to main content

布尔索引

NumPy 最强大的特性之一,用条件直接筛选数据,替代 Python 的 filter


基础用法

a = np.random.randint(0, 10, 20) # 随机 20 个 0-9 的整数

a[a > 5] # 选出所有大于 5 的数

对比原生 Python 的 filter:

# ❌ 原生 Python
result = list(filter(lambda x: x > 5, a))

# ✅ NumPy 布尔索引
result = a[a > 5]

原理分解

布尔索引分两步:

# 第一步:a > 5 返回布尔数组
mask = a > 5 # [True False True True ...]

# 第二步:用布尔数组索引 —— 所有 True 位置的元素被取出
result = a[mask]

手动构造布尔索引

a = np.array([10, 20, 30, 40])
a[[True, False, True, False]] # [10, 30]

组合条件

# 选出大于 5 的偶数(与)
a[(a > 5) & (a % 2 == 0)] # ✅ 用 & ,必须加括号!

# 选出大于 5 或是偶数的数(或)
a[(a > 5) | (a % 2 == 0)] # ✅ 用 | ,必须加括号!

# ❌ 不要用 Python 的 and / or —— 会报错或得到意外结果

错误示范:

# ❌ a[a > 5 and a % 2 == 0] → 报错!
# 原因:and/or 是 Python 关键字,不能重载;& 和 | 是位运算符,NumPy 重载了它们

关键规则:用 & 代替 and,用 | 代替 or每个条件必须加括号(运算符优先级问题)。


处理 NaN 值

b = np.array([1.0, np.nan, 2.0, np.nan, 3.0])

np.isnan(b) # [False True False True False]
b[~np.isnan(b)] # [1. 2. 3.] —— 过滤掉 NaN

np.nan 不等于任何值(包括它自己),必须用 isnan() 判断。后续 Pandas 中 NaN 作为缺失值广泛使用。