NumPy 的布尔数组索引是一种非常强大的功能,它允许您使用布尔值数组来选择数组中的特定元素。下面是一些详细的实现示例:
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]
# 创建一个二维数组
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]
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]
# 创建二维数组
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]
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]
# 创建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]
# 创建包含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)
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)
# 预先计算布尔掩码可以提升性能
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中非常高效的数据选择方法,特别适合用于条件筛选和数据处理任务。