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

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中非常高效的数据选择方法,特别适合用于条件筛选和数据处理任务。

相关帖子
如何快速显示macOS中的隐藏文件? Mac查找隐藏文件的方法
如何快速显示macOS中的隐藏文件? Mac查找隐藏文件的方法
如何理解“睡眠储蓄账户”这个概念?它对我们的日常生活意味着什么?
如何理解“睡眠储蓄账户”这个概念?它对我们的日常生活意味着什么?
春节拼车回家时,车主和乘客分别需要注意哪些安全问题?
春节拼车回家时,车主和乘客分别需要注意哪些安全问题?
梧州市企业获客软件#商城网站建设公司,优秀开发团队
梧州市企业获客软件#商城网站建设公司,优秀开发团队
梧州市大型活动保障救护车租赁服务-接送患者转院出院
梧州市大型活动保障救护车租赁服务-接送患者转院出院
办理出生医学证明需要准备哪些材料,2026年的流程与过去有何不同?
办理出生医学证明需要准备哪些材料,2026年的流程与过去有何不同?
“僵尸自行车”不仅影响美观,还可能带来安全隐患,我们该如何看待?
“僵尸自行车”不仅影响美观,还可能带来安全隐患,我们该如何看待?
石家庄市救护车长途运送病人-急救车长途转运护送病人
石家庄市救护车长途运送病人-急救车长途转运护送病人
当促销活动的规则模糊时,商家能否凭借“最终解释权”随意更改?
当促销活动的规则模糊时,商家能否凭借“最终解释权”随意更改?
指甲月牙的多少和大小,真的能代表一个人的气血是否充足吗?
指甲月牙的多少和大小,真的能代表一个人的气血是否充足吗?
在数字时代,我们如何平衡身份识别的便利性与个人隐私保护之间的关系?
在数字时代,我们如何平衡身份识别的便利性与个人隐私保护之间的关系?
如果先落户后就业,是否还有资格申请当地针对新引进人才的一次性生活补贴?
如果先落户后就业,是否还有资格申请当地针对新引进人才的一次性生活补贴?
朔州市救护车出租跨省转运病人-病人转院救护车,24小时随叫随到
朔州市救护车出租跨省转运病人-病人转院救护车,24小时随叫随到
从原单位离职后,自己可以主动申请将公积金账户转为封存状态吗?
从原单位离职后,自己可以主动申请将公积金账户转为封存状态吗?
榆林市SEO网络推广#商城网站搭建,多年建站经验
榆林市SEO网络推广#商城网站搭建,多年建站经验
文山精准获客软件@网站开发本地公司,网站制作
文山精准获客软件@网站开发本地公司,网站制作
纳西族的三朵节是为了纪念哪位保护神,这个节日如何体现纳西人对自然的崇拜?
纳西族的三朵节是为了纪念哪位保护神,这个节日如何体现纳西人对自然的崇拜?
2026年医保异地就医备案政策相比往年有哪些重要的调整?
2026年医保异地就医备案政策相比往年有哪些重要的调整?
宣城市营销型网站建设@网站建设本地公司,专业建站
宣城市营销型网站建设@网站建设本地公司,专业建站
扬州市软件开发#网站开发设计服务,小程序开发
扬州市软件开发#网站开发设计服务,小程序开发