欢迎光临中国护送网
详情描述

NumPy 的布尔数组索引是一种非常强大的功能,它允许您使用布尔值数组来选择数组中的特定元素。下面是一些详细的实现示例:

1. 基本布尔索引

import numpy as np

# 创建一个数组
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

# 创建布尔数组
bool_mask = np.array([True, False, True, False, True, False, True, False, True])

# 使用布尔数组索引
result = arr[bool_mask]
print("布尔索引结果:", result)  # [1 3 5 7 9]

2. 条件创建布尔数组

# 创建一个二维数组
matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 条件判断创建布尔数组
bool_mask = matrix > 5
print("布尔掩码:")
print(bool_mask)

# 使用布尔索引选择元素
selected = matrix[bool_mask]
print("大于5的元素:", selected)  # [6 7 8 9]

3. 组合多个条件

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 组合多个条件
mask = (arr > 3) & (arr < 8)  # 使用 & 而不是 and
result = arr[mask]
print("3 < x < 8:", result)  # [4 5 6 7]

# 使用或条件
mask_or = (arr < 3) | (arr > 8)
result_or = arr[mask_or]
print("x < 3 或 x > 8:", result_or)  # [1 2 9 10]

# 使用非条件
mask_not = ~(arr > 5)
result_not = arr[mask_not]
print("不大于5:", result_not)  # [1 2 3 4 5]

4. 二维数组的布尔索引

# 创建二维数组
arr_2d = np.array([[1, 2, 3],
                    [4, 5, 6],
                    [7, 8, 9]])

# 选择特定行
row_mask = np.array([True, False, True])
selected_rows = arr_2d[row_mask]
print("选择第1和第3行:")
print(selected_rows)

# 选择特定元素
element_mask = arr_2d > 4
selected_elements = arr_2d[element_mask]
print("大于4的元素:", selected_elements)  # [5 6 7 8 9]

5. 使用布尔索引修改数组

arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

# 使用布尔索引修改元素
mask = arr > 5
arr[mask] = 0
print("修改后数组:", arr)  # [1 2 3 4 5 0 0 0 0]

# 更复杂的修改
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[arr % 2 == 0] *= 10  # 所有偶数乘以10
print("偶数乘以10:", arr)  # [1 20 3 40 5 60 7 80 9]

6. 多维布尔索引

# 创建3D数组
arr_3d = np.array([[[1, 2], [3, 4]],
                   [[5, 6], [7, 8]]])

# 创建布尔掩码
mask = arr_3d > 3

# 使用布尔索引
result = arr_3d[mask]
print("大于3的元素:", result)  # [4 5 6 7 8]

7. 实用示例:数据处理

# 创建包含NaN的数据
data = np.array([1.0, 2.0, np.nan, 4.0, np.nan, 6.0])

# 找出非NaN值
non_nan_mask = ~np.isnan(data)
clean_data = data[non_nan_mask]
print("非NaN数据:", clean_data)

# 找出有限值(非inf和非NaN)
finite_mask = np.isfinite(data)
finite_data = data[finite_mask]
print("有限值数据:", finite_data)

8. 布尔索引与 fancy 索引结合

arr = np.array([[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]])

# 行选择
row_mask = np.array([True, False, True])

# 列选择(使用fancy索引)
selected = arr[row_mask, :][:, [0, 2]]  # 选择第1、3行的第1、3列
print("选择的行和列:")
print(selected)

9. 性能优化提示

# 预先计算布尔掩码可以提升性能
arr = np.random.rand(1000000)

# 方法1:直接使用条件(每次重新计算)
result1 = arr[arr > 0.5]

# 方法2:预先计算掩码(更高效)
mask = arr > 0.5
result2 = arr[mask]

print(f"结果相同: {np.array_equal(result1, result2)}")

注意事项:

使用位运算符& (和), | (或), ~ (非) 而不是 and, or, not 使用括号:多个条件需要括号包裹 形状匹配:布尔数组的形状必须与被索引数组的形状匹配(或可广播) 修改原数组:通过布尔索引修改元素会直接影响原数组

布尔数组索引是NumPy中非常高效的数据选择方法,特别适合用于条件筛选和数据处理任务。