HOWTO · NumPy
numpy.where() 多个条件
在 Python 中,可以通过 &、|、numpy.logical_and() 和 numpy.logical_or() 这 4 种方式,在 numpy.where() 中组合多个条件。
本页内容
可以用 & 或 | 组合数组比较条件,也可以使用 numpy.logical_and() 或 numpy.logical_or(),再将生成的布尔数组传给 numpy.where()。使用 & 或 | 时,每个比较表达式都要加括号。下面的示例分别筛选大于 2 且小于 4 的值,以及大于 2 或能被 2 整除的值。所有条件都必须满足时使用 AND;任一条件满足即可时使用 OR。每次比较都会生成一个与 values 对齐的布尔数组,组合这些数组后就得到用于筛选的条件。
下面每个示例都会打印筛选出的值,输出紧跟在对应代码后面。
在 Python 中使用 & 运算符组合 numpy.where() 的多个条件
使用 & 要求数组中的元素满足每一个比较条件。每个比较表达式都必须加括号,否则 Python 的运算符优先级可能会改变表达式的求值方式。下面的示例筛选大于 2 且小于 4 的值,不包含端点:
import numpy as np
values = np.array([1, 2, 3, 4, 5])
result = values[np.where((values > 2) & (values < 4))]
print(result)
[3]
np.where(condition) 会返回一个包含匹配索引的元组。用这个元组索引 values,即可取出对应元素,因此本例筛选出的值是 3。如果要添加更多条件,请将每个比较表达式分别括在括号中,再用 & 连接;所有条件都为真时,该元素才会保留在结果中。
在 Python 中使用 | 运算符组合 numpy.where() 的多个条件
只要任一比较条件成立,就可以使用 |。在 NumPy 条件表达式中,| 执行逐元素 OR 运算:它会组合两个比较结果中对应位置的布尔值。本例会选出大于 2 或能被 2 整除的元素。逐元素 OR 运算前,两个比较表达式都加了括号:
import numpy as np
values = np.array([1, 2, 3, 4, 5])
result = values[np.where((values > 2) | (values % 2 == 0))]
print(result)
[2 3 4 5]
值 2 满足整除条件,3 和 5 满足大于条件,而 4 同时满足两个条件。numpy.where() 对每个匹配位置只返回一次,因此筛选结果中的 4 不会重复出现。如果多个条件中任意一个成立就应选中元素,也可以用 | 连接更多加了括号的比较表达式。
使用 numpy.logical_and() 函数组合 numpy.where() 的多个条件
numpy.logical_and() 会逐元素组合两个条件,是 & 写法的函数形式。将它的结果传给 numpy.where() 可获得匹配索引,再用这些索引筛选值:
import numpy as np
values = np.array([1, 2, 3, 4, 5])
condition = np.logical_and(values > 2, values < 4)
result = values[np.where(condition)]
print(result)
[3]
本例中,元素必须同时满足两个比较条件才会被选中。对于这里形状相同的输入,条件数组与 values 的形状相同。需要添加其他条件时,可以分步组合逻辑函数的结果,这样较长的条件更容易阅读和检查。
在 Python 中使用 numpy.logical_or() 函数组合 numpy.where() 的多个条件
如果任一条件成立即可选中元素,numpy.logical_or() 会逐元素组合这些条件。与运算符写法一样,本例筛选大于 2 或能被 2 整除的值:
import numpy as np
values = np.array([1, 2, 3, 4, 5])
condition = np.logical_or(values > 2, values % 2 == 0)
result = values[np.where(condition)]
print(result)
[2 3 4 5]
对 NumPy 数组执行逐元素运算时应使用 & 和 |;Python 的标量逻辑运算符 and 和 or 不能用来组合 NumPy 布尔数组。如果你更喜欢具名操作,或者需要分步构造条件,可以使用逻辑函数。对于形状兼容的条件,NumPy 会逐元素执行逻辑函数。在每个示例中,values[np.where(condition)] 都会使用索引元组取回原数组中的值;单独调用 np.where(condition) 得到的是位置,而不是这些位置上的值。条件数组的形状应与要筛选的数据兼容。