趋近智
NumPy 数组支持逻辑比较,从而能够在数据分析工作流程中实现高效的数据筛选、条件检查和决策制定。这些逻辑运算通常按元素应用,与 NumPy 中的算术运算非常相似,并生成布尔值(True 或 False)的数组。
您可以使用标准 Python 比较运算符将整个数组与标量值进行比较,或者逐元素比较两个数组。NumPy 重载了这些运算符,使其可以在数组上高效工作。
可用的比较运算符有:
== (等于)!= (不等于)< (小于)> (大于)<= (小于或等于)>= (大于或等于)我们来看看它们是如何工作的。
数组与标量比较
当您将 NumPy 数组与单个数字(一个标量)进行比较时,NumPy 会在标量与数组的每个元素之间执行比较,并返回一个相同形状的新布尔数组。
import numpy as np
# 创建一个示例数组
ages = np.array([25, 18, 65, 40, 12])
# 检查哪些年龄大于 21
is_adult = ages > 21
print(is_adult)
# 预期输出: [ True False True True False]
# 检查哪些年龄正好是 18
is_eighteen = ages == 18
print(is_eighteen)
# 预期输出: [False True False False False]
结果 is_adult 是一个布尔数组,在满足条件 age > 21 的地方为 True,否则为 False。
比较两个数组
您也可以比较两个数组,前提是它们具有兼容的形状(要么形状相同,要么根据广播规则兼容的形状,我们稍后会讨论)。比较是逐元素执行的。
# 创建两个分数数组
scores1 = np.array([85, 92, 78, 88])
scores2 = np.array([85, 90, 80, 88])
# 检查分数相同的地方
equal_scores = scores1 == scores2
print(equal_scores)
# 预期输出: [ True False False True]
# 检查 scores1 小于 scores2 的地方
lower_scores = scores1 < scores2
print(lower_scores)
# 预期输出: [False False True False]
结果布尔数组中的每个元素都对应于原始数组中相同位置元素的比较结果。
通常,您需要同时检查多个条件。例如,您可能希望找到大于下限且小于上限的元素。NumPy 为此使用了逐元素的逻辑运算符:
& (逻辑与)| (逻辑或)~ (逻辑非)重要提示: 在 NumPy 数组上进行逐元素逻辑运算时,请使用位运算符
&、|和~,而不是 Python 关键字and、or和not。关键字and和or评估整个对象的真值,而&和|则对数组内的布尔值执行逐元素比较。另外,请记住由于运算符优先级,要在单个比较周围使用括号()。
我们来结合之前 ages 数组的条件:
# 找到 20 到 50 岁之间(不包括 20,包括 50)
working_age = (ages > 20) & (ages <= 50)
print(working_age)
# 原始年龄: [25, 18, 65, 40, 12]
# 预期输出: [ True False False True False]
# 找到小于 18 岁或大于 60 岁的人
young_or_senior = (ages < 18) | (ages > 60)
print(young_or_senior)
# 原始年龄: [25, 18, 65, 40, 12]
# 预期输出: [False False True False True]
# 找到不等于 18 岁的人
not_eighteen = ~(ages == 18)
# 这等同于: not_eighteen = ages != 18
print(not_eighteen)
# 原始年龄: [25, 18, 65, 40, 12]
# 预期输出: [ True False True True True]
这些组合的布尔数组对于选择满足多个条件的数据非常有用,这是一种通常被称为布尔索引的技巧(您在第三章中遇到过)。
any() 和 all()有时,您不需要逐元素的结果,而是需要一个概要:任何元素是否满足条件,或者所有元素都满足条件?NumPy 为此提供了数组的 any() 和 all() 方法(以及独立函数 np.any()、np.all())。
any(): 如果布尔数组中至少有一个元素为 True,则返回 True。all(): 仅当布尔数组中所有元素都为 True 时,才返回 True。# 创建一个布尔数组
results = np.array([True, False, True, True])
# 检查是否有任何结果为 True
print(results.any())
# 预期输出: True
# 检查是否所有结果都为 True
print(results.all())
# 预期输出: False
# 再次使用我们的 ages 数组
ages = np.array([25, 18, 65, 40, 12])
# 有青少年(年龄 < 20)吗?
print((ages < 20).any())
# 预期输出: True (因为 18 和 12 小于 20)
# 所有年龄都大于等于 18 吗?
print((ages >= 18).all())
# 预期输出: False (因为 12 小于 18)
这些函数有助于快速检查和断言您的数据。您也可以在多维数组中沿着特定轴应用 any() 和 all(),类似于 sum() 或 mean() 等统计函数。
逻辑运算是数据选择和操作的核心部分。它们生成的布尔数组充当强大的掩码,用于根据复杂条件筛选和修改您的数据集。当您处理更大的数据集时,使用 NumPy 的向量 (vector)化逻辑运算将比编写显式 Python 循环效率显著提高。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造