数组可以通过数字位置(例如 array[2]、array[1, 3])或通过对数据范围进行切片(例如 array[1:5])进行索引。然而,有时你需要根据数据的值或某些条件而不是其位置来选择数据。在这种情况下,布尔索引是一种强大的技术,它允许你使用 True/False 条件来筛选数组。创建布尔数组布尔索引的基础是布尔数组。你通常通过将比较运算符直接应用于 NumPy 数组来创建这些数组。NumPy 会逐元素执行比较,返回一个形状相同、填充了 True 或 False 值的新数组。我们来看一个例子:import numpy as np # 创建一个简单的一维数组 data = np.array([1, 5, 2, 8, 3, 7, 4, 6]) print(f"原始数组: {data}") # 应用一个条件 is_greater_than_4 = data > 4 print(f"布尔数组 (data > 4): {is_greater_than_4}")执行这段代码会得到以下输出:Original array: [1 5 2 8 3 7 4 6] Boolean array (data > 4): [False True False True False True False True]请注意 is_greater_than_4 具有与 data 相同数量的元素。如果 data 中对应元素大于 4,则 is_greater_than_4 中的每个元素为 True,否则为 False。你可以使用任何标准比较运算符:>、<、>=、<=、== (等于) 和 != (不等于)。使用布尔数组选择数据有了布尔数组后,你可以将其直接用作原始数组方括号 [] 内的索引。此操作会从原始数组中选择布尔数组中对应值为 True 的元素。# 使用布尔数组选择元素 selected_data = data[is_greater_than_4] print(f"选定元素 (data > 4 时): {selected_data}") # 你也可以直接在方括号内应用条件 selected_directly = data[data < 5] print(f"选定元素 (data < 5 时): {selected_directly}")输出:Selected elements (where data > 4): [5 8 7 6] Selected elements (where data < 5): [1 2 3 4]结果是一个新的一维数组,只包含满足条件的元素。无论原始数组的维度如何,这都适用。我们用二维数组来试试:matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 选择大于 5 的元素 selected_matrix_elements = matrix[matrix > 5] print(f"\n原始二维数组:\n{matrix}") print(f"选定元素 (matrix > 5 时): {selected_matrix_elements}")输出:Original 2D array: [[1 2 3] [4 5 6] [7 8 9]] Selected elements (where matrix > 5): [6 7 8 9]重要提示:请注意,即使将布尔索引应用于二维数组,结果通常也是一个包含所选元素的一维数组。NumPy 会将输出展平,因为 True 值可能分散在不同的行和列中,不一定形成一个矩形子数组。{"data":[{"x":[0,1,2,3,4,5,6,7],"y":[1,5,2,8,3,7,4,6],"mode":"markers","type":"scatter","name":"所有数据","marker":{"color":"#adb5bd","size":8}},{"x":[1,3,5,7],"y":[5,8,7,6],"mode":"markers","type":"scatter","name":"data > 4","marker":{"color":"#228be6","size":10}}],"layout":{"title":"布尔选择的可视化 (data > 4)","xaxis":{"title":"索引"},"yaxis":{"title":"值"},"showlegend":true}}散点图显示了原始数据点(灰色)以及使用条件 data > 4 选择的点(蓝色)。组合多个条件你经常需要同时根据多个条件筛选数据。你可以使用逻辑运算符组合布尔数组:& (逻辑与): 选择两个条件都为 True 的元素。| (逻辑或): 选择至少一个条件为 True 的元素。~ (逻辑非): 反转布尔数组(将 True 变为 False,False 变为 True)。重要提示: 当使用 & 或 | 组合条件时,你必须在每个单独的条件周围使用括号 ()。这是因为 Python 和 NumPy 中的运算符优先级规则。位运算符 & 和 | 的优先级高于比较运算符,如 < 或 >。如果没有括号,Python 可能会尝试评估类似 data > 3 & data 的表达式,这会导致错误或意料之外的结果。data = np.array([1, 5, 2, 8, 3, 7, 4, 6, 9, 0]) # 条件 1: data > 3 # 条件 2: data < 8 selected_and = data[(data > 3) & (data < 8)] print(f"元素满足 (data > 3) 且 (data < 8): {selected_and}") # 条件 1: data 为偶数 (data % 2 == 0) # 条件 2: data > 5 selected_or = data[(data % 2 == 0) | (data > 5)] print(f"元素满足 (data 为偶数) 或 (data > 5): {selected_or}") # 条件: data 不等于 5 selected_not = data[~(data == 5)] print(f"元素满足 data 不等于 5: {selected_not}")输出:Elements where (data > 3) AND (data < 8): [5 7 4 6] Elements where (data is even) OR (data > 5): [2 8 7 4 6 9 0] Elements where data is NOT equal to 5: [1 2 8 3 7 4 6 9 0]使用布尔索引修改数据布尔索引不仅用于选择;它对于修改符合特定条件的数组元素也非常有用。你可以在赋值操作的左侧使用布尔索引,来改变条件为 True 的所有元素的值。# 创建一个包含正数和负数的数组 arr = np.array([1, -2, 3, -4, 5, -6]) print(f"原始数组: {arr}") # 将所有负数替换为 0 arr[arr < 0] = 0 print(f"将负数替换为 0 后的数组: {arr}") # 将所有大于 3 的元素设置为特定值(例如 100) arr[arr > 3] = 100 print(f"将大于 3 的元素设置为 100 后的数组: {arr}")输出:Original array: [ 1 -2 3 -4 5 -6] Array after replacing negatives with 0: [1 0 3 0 5 0] Array after setting elements > 3 to 100: [ 1 0 3 0 100 0]这种方法在数据清理和准备中很常见,例如,替换无效的传感器读数或限制异常值。布尔索引提供了一种灵活易读的方法,可以根据数据本身筛选和处理 NumPy 数组,是高效数据分析流程的重要组成部分。