欢迎光临护送网
详情描述

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查找隐藏文件的方法
合表用户和一户一表用户在阶梯电价上有什么区别,哪种更划算一点?
合表用户和一户一表用户在阶梯电价上有什么区别,哪种更划算一点?
济宁市AI数字人视频制作#商城网站建设,优秀开发团队
济宁市AI数字人视频制作#商城网站建设,优秀开发团队
东方市病人转运服务车出租公司-全国各地都有车,就近派车
东方市病人转运服务车出租公司-全国各地都有车,就近派车
2026年有三甲医生公开自己的
2026年有三甲医生公开自己的"三不治"预嘱引发热议,这事为什么戳中了这么多家庭?
自由职业者收一笔设计费、咨询费,对方要求提供材料时最容易搞混的是哪几个概念?
自由职业者收一笔设计费、咨询费,对方要求提供材料时最容易搞混的是哪几个概念?
用高压锅快速煮米饭,怎样才能达到和电饭煲慢煮类似的口感效果?
用高压锅快速煮米饭,怎样才能达到和电饭煲慢煮类似的口感效果?
同样是老年优惠乘车,为什么不同城市的办理年龄、使用范围会差这么多?
同样是老年优惠乘车,为什么不同城市的办理年龄、使用范围会差这么多?
生孩子的医院收费明细通常包含哪些部分?如何看懂账单?
生孩子的医院收费明细通常包含哪些部分?如何看懂账单?
兼职或临时工的工资,是否也适用“及时支付”的相关法律规定?
兼职或临时工的工资,是否也适用“及时支付”的相关法律规定?
长辈总说
长辈总说"烫水才解乏",但从居家安全角度看,水温太高对长者和小朋友有哪些不易察觉的影响?
陵水120救护车出租长途跨省转运-长途急救车出租,按公里收费
陵水120救护车出租长途跨省转运-长途急救车出租,按公里收费
双鸭山市救护车转运病人-救护车转院病人返乡,24小时在线电话
双鸭山市救护车转运病人-救护车转院病人返乡,24小时在线电话
兰州市苹果app开发@企业网站搭建,优秀设计团队
兰州市苹果app开发@企业网站搭建,优秀设计团队
绍兴市软件系统开发#php开源网站二次开发,一站式服务
绍兴市软件系统开发#php开源网站二次开发,一站式服务