在 NumPy 中,布尔索引允许我们根据特定条件过滤数组中的元素。
我们使用布尔掩码来指定条件。
在学习布尔索引之前,我们需要了解布尔掩码。
NumPy 中的布尔掩码
布尔掩码是一个包含真值(True/False)的 NumPy 数组,它对应于数组中的每个元素。
假设我们有一个名为 array1 的数组。
array1 = np.array([12, 24, 16, 21, 32, 29, 7, 15])
现在我们创建一个掩码,选择 array1 中所有大于 20 的元素。
boolean_mask = array1 > 20
在这里,array1 > 20
创建了一个布尔掩码,对于大于 20 的元素评估为 True
,对于小于或等于 20 的元素评估为 False
。
生成的掩码是一个存储在 boolean_mask 变量中的数组,如下所示:
[False, True, False, True, True, True, False, False]
NumPy 中的一维布尔索引
布尔索引允许我们通过传递布尔掩码作为索引来创建一个过滤后的数组子集。
布尔掩码仅选择数组中在相应索引位置具有 True
值的元素。
让我们对上面示例中的布尔掩码进行布尔索引。
array1[boolean_mask]
结果如下:
[24, 21, 32, 29]
现在让我们看另一个例子。
我们将使用布尔索引仅从数组中选择奇数。
import numpy as np
# create an array of numbers
array1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# create a boolean mask
boolean_mask = array1 % 2 != 0
# boolean indexing to filter the odd numbers
result = array1[boolean_mask]
print(result)
# Output: [ 1 3 5 7 9]
在此示例中,我们使用布尔索引仅从 array1 数组中选择了奇数。
在这里,表达式 numbers % 2 != 0
是一个布尔掩码。如果 array1 的元素满足布尔掩码中指定的条件,则该元素(奇数)将被替换为 True
,偶数将被替换为 False
。
通过布尔索引,会返回一个只包含 True
值元素的过滤后的数组。因此,我们得到一个只包含奇数的数组。
示例:NumPy 中的一维布尔索引
import numpy as np
# create an array of integers
array1 = np.array([1, 2, 4, 9, 11, 16, 18, 22, 26, 31, 33, 47, 51, 52])
# create a boolean mask using combined logical operators
boolean_mask = (array1 < 10) | (array1 > 40)
# apply the boolean mask to the array
result = array1[boolean_mask]
print(result)
# Output: [ 1 2 4 9 47 51 52]
在这里,我们使用 |
运算符创建了一个布尔掩码,以选择 array1 中所有小于 10 或大于 40 的元素。
使用布尔索引修改元素
在 NumPy 中,我们可以使用布尔索引来修改数组的元素。例如,
import numpy as np
# create an array of numbers
numbers = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
# make a copy of the array
numbers_copy = numbers.copy()
# change all even numbers to 0 in the copy
numbers_copy[numbers % 2 == 0] = 0
# print the modified copy
print(numbers_copy)
# Output: [1 0 3 0 5 0 7 0 9 0]
在这里,numbers_copy[numbers % 2 == 0]
访问数组中的所有偶数,然后我们将这些数字赋值为 0。
NumPy 中的二维布尔索引
布尔索引也可以应用于 NumPy 中的多维数组。
让我们看一个例子。
import numpy as np
# create a 2D array
array1 = np.array([[1, 7, 9],
[14, 19, 21],
[25, 29, 35]])
# create a boolean mask based on the condition
# that elements are greater than 9
boolean_mask = array1 > 9
# select only the elements that satisfy the condition
result = array1[boolean_mask]
print(result)
输出
[14 19 21 25 29 35]
在此示例中,我们将布尔索引应用于名为 array1 的二维数组。
然后我们根据元素大于 9 的条件创建了 boolean_mask。结果掩码如下:
[[False, False, False],
[ True, True, True],
[ True, True, True]]
然后我们使用此布尔掩码对 array1 进行索引,这将返回一个扁平化的 1D 数组,其中仅包含满足条件的元素。
[14, 19, 21, 25, 29, 35]