HOWTO · Python
在 Python 中获取布尔值的否定值
本教程演示了如何在 Python 中否定布尔值。
本页内容
在 Python 中,使用 not 运算符可反转标量表达式的真值。对于 NumPy 布尔数组,可使用 ~ 或 numpy.logical_not() 等逐元素运算。NumPy 的 bitwise_not() 和 invert() 函数也能反转布尔数组中的元素。
在 Python 中使用 not 运算符反转布尔值
not 运算符会先测试操作数的真值,再返回一个布尔值:True 变为 False,False 变为 True。它也接受本身不是布尔值的对象。例如,not 1 的结果是 False,因为 1 为真;这个结果是布尔值 False,而不是整数 0。
下面的示例反转一个条件,并打印得到的布尔值:
a = 1
print(bool(a))
print(not a)
在 Python 中使用 operator 模块的 operator.not_() 函数反转布尔值
标准库中的 operator.not_() 函数可以作为 Python not 运算符的可调用形式。它会测试参数的真值并返回一个布尔值。当某个操作需要以函数形式传入时,可以使用它,例如将其传给 map() 来处理列表:
import operator
values = [True, True, False, True, False]
print(operator.not_(True))
print(list(map(operator.not_, values)))
map() 会将提供的函数应用于可迭代对象中的每一项。在这个示例中,列表中的每一项都是布尔值,因此结果列表中的每个值都与对应的原值相反。
在 Python 中使用 ~ 运算符反转 NumPy 数组中的布尔值
对于布尔类型的 NumPy 数组,~ 运算符会逐元素执行按位取反:每个 True 都变为 False,每个 False 都变为 True:
import numpy as np
values = np.array([True, True, False, True, False])
print(~values)
这种布尔数组行为适合用来反转掩码。Python 整数并不是布尔值:对整数应用 ~ 会执行整数按位取反,因此不要用它代替标量真值取反。
使用 NumPy 库中的 bitwise_not() 函数反转布尔值
numpy.bitwise_not() 是按位运算对应的函数形式。对于布尔数组,它会反转每个元素,得到与 ~ 相同的逐元素布尔结果:
import numpy as np
values = np.array([True, True, False, True, False])
print(np.bitwise_not(values))
当具名的 NumPy 操作更适合你的代码时,可以使用这个函数;它也适用于单个 NumPy 布尔值。
在 Python 中使用 NumPy 库的 invert() 函数反转布尔值
numpy.invert() 是 NumPy 逐元素按位取反操作的另一种名称。对于布尔数组,它的行为与 bitwise_not() 和 ~ 相同:
import numpy as np
values = np.array([True, True, False, True, False])
print(np.invert(values))
选择能让代码中的操作意图最清楚的写法。和 ~ 一样,对整数数据使用 invert() 执行的是按位取反,而不是布尔真值取反。
在 Python 中使用 NumPy 库的 logical_not() 函数反转布尔值
numpy.logical_not() 会逐元素执行逻辑取反。对于布尔数组,它得到的值与上面介绍的按位取反函数相同;从名称上看,它更强调逻辑真值:
import numpy as np
values = np.array([True, True, False, True, False])
print(np.logical_not(values))
对于标量 Python 表达式,使用 not;对于需要逐元素处理的布尔数组,可使用这些 NumPy 操作来得到相应的数组结果。