
10.1 比较函数概述
数据分析中经常需要根据条件筛选数据,NumPy 提供了一系列比较函数来实现逐元素的条件判断。下表列出了本节涉及的比较函数:
| 函数 | 功能 |
|---|---|
np.greater(a, b) | 逐元素判断 a 是否大于 b |
np.less(a, b) | 逐元素判断 a 是否小于 b |
np.equal(a, b) | 逐元素判断 a 是否等于 b |
np.logical_and(a, b) | 逐元素逻辑与运算 |
np.logical_or(a, b) | 逐元素逻辑或运算 |
np.logical_not(a) | 逐元素逻辑非运算 |
np.any(a) | 检查数组中是否至少有一个 True |
np.all(a) | 检查数组中是否全部元素为 True |
np.where(condition, x, y) | 根据条件选择元素 |
np.select(condlist, choicelist) | 多条件选择元素 |
10.2 大于、小于、等于
这三个函数用于逐元素比较两个数组(或数组与标量)的大小关系,返回布尔数组。
import numpy as np
# 是否大于print(np.greater([3, 4, 5, 6, 7], 4))# 是否小于print(np.less([3, 4, 5, 6, 7, 8], 4))# 是否等于print(np.equal([3, 4, 5, 6, 7, 8], 4))print(np.equal([3, 4, 5], [4, 4, 4]))输出:
[False False True True True][ True False False False False False][False True False False False False][False True False]要点说明:
- 当第二个参数是标量时,每个元素与该标量比较,等价于使用
>、<、==运算符。 - 当两个数组长度相同时,逐位置一一对应比较。
- 返回值是一个布尔数组,常配合布尔索引使用(参见第6节)。
10.3 逻辑运算
np.logical_and()、np.logical_or() 和 np.logical_not() 用于对布尔数组进行逐元素的逻辑运算。
print(np.logical_and([1, 0], [1, 1])) # 逻辑与print(np.logical_not([1, 0])) # 逻辑非print(np.logical_or([0, 0], [1, 0])) # 逻辑或输出:
[ True False][False True][ True False]要点说明:
np.logical_and():两个输入都为真时返回True。np.logical_or():至少一个输入为真时返回True。np.logical_not():对布尔值取反。- 在布尔索引中组合多个条件时,使用
&(与)、|(或)运算符(参见第6节)。
10.4 any 与 all
np.any() 检查数组中是否至少有一个 True,np.all() 检查数组中是否全部为 True。
# 检查是否至少有一个元素为 Trueprint(np.any([0, 1, 0, 0, 0]))print(np.any([0, 0, 0, 0, 0]))
# 检查是否全部元素为 Trueprint(np.all([1, 1]))print(np.all([1, 0]))输出:
TrueFalseTrueFalse这两个函数常用于数据验证场景,例如检查数据集中是否存在缺失值、所有样本是否满足某个条件等。
10.5 np.where()
np.where(condition, x, y) 是条件筛选的核心函数。当 condition 为 True 时取 x 对应的值,否则取 y 对应的值。
arr = np.array([1, 2, 3, 4, 5])
print(np.where(arr > 3, arr, 0)) # 大于3的保留原值,否则置0print(np.where(arr < 3, 1, 0)) # 小于3的置1,否则置0输出:
[0 0 0 4 5][1 1 0 0 0]实际应用:成绩等级评定
score = np.random.randint(50, 100, 20)print(score)print(np.where(score >= 60, '及格', '不及格'))输出(结果随机):
[53 89 59 69 71 86 73 56 74 74 62 51 88 89 73 96 74 67 87 75]['不及格' '及格' '不及格' '及格' '及格' '及格' '及格' '不及格' '及格' '及格' '及格' '不及格' '及格' '及格' '及格' '及格' '及格' '及格' '及格' '及格']嵌套 np.where() 实现多级判定:
print(np.where( score < 60, '不及格', np.where( score < 80, '良好', '优秀' )))输出(结果随机):
['不及格' '优秀' '不及格' '良好' '良好' '优秀' '良好' '不及格' '良好' '良好' '良好' '不及格' '优秀' '优秀' '良好' '优秀' '良好' '良好' '优秀' '良好']通过嵌套 np.where(),可以实现”不及格 / 良好 / 优秀”三级分类。逻辑是:先判断是否小于 60,若是则”不及格”;否则再判断是否小于 80,若是则”良好”,否则”优秀”。
10.6 np.select()
当条件分支较多时,嵌套 np.where() 可读性较差。np.select(condlist, choicelist) 提供更清晰的多条件选择方式。
print(np.select( [score > 80, (score >= 60) & (score <= 80), score < 60], ['优秀', '良好', '不及格'], default='未知'))输出(结果随机):
['不及格' '优秀' '不及格' '良好' '良好' '优秀' '良好' '不及格' '良好' '良好' '良好' '不及格' '优秀' '优秀' '良好' '优秀' '良好' '良好' '优秀' '良好']要点说明:
condlist:条件列表,按顺序逐一判断,命中的第一个条件对应的值被选中。choicelist:返回值列表,与条件列表一一对应。default:当所有条件都不满足时的兜底值。- 条件按顺序匹配(类似
if-elif-else),排在前面的条件优先级更高。
10.7 本节小结
本节完成了以下内容:
- 掌握了
np.greater()、np.less()、np.equal()逐元素比较函数。 - 掌握了
np.logical_and()、np.logical_or()、np.logical_not()逻辑运算。 - 掌握了
np.any()和np.all()的数组整体真值判断。 - 掌握了
np.where()条件筛选与嵌套多级判定。 - 掌握了
np.select()多条件选择及其default参数。
下一节我们将学习 NumPy 中的排序函数,包括排序、去重、数组拼接与分割。
数据分析
连载中分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 94 天
部分内容可能已过时
评论