Numpy布尔索引与掩码

news2024/11/15 13:21:30

NumPy 是用于科学计算和处理多维数组数据的最流行的 Python 库之一。NumPy 提供了强大的功能,可以根据布尔条件从数组中索引和提取元素,这称为布尔索引或掩码。掌握布尔索引和掩码可以使用 NumPy 进行高效的数据操作和分析。

本综合指南将解释你需要了解的有关 NumPy 中布尔索引和掩码的所有信息,包括关键概念、用法和示例,以帮助你在自己的项目中利用这些技术。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、布尔索引和掩码简介

布尔索引是指根据布尔条件或掩码选择数组元素的过程。掩码可以是布尔数组或列表,其中 True 表示要选择的元素。布尔掩码遵循相同的原理,但使用 NumPy 布尔数组而不是列表。

以下是有关 NumPy 中的布尔索引和掩码的一些要点:

  • 允许基于布尔逻辑而不是直接索引从 NumPy 数组中选择或过滤值。
  • 布尔数组/掩码中与 True 对应的元素会被选中,而 False 值则不会被选中。
  • 提供一种强大而灵活的方法,从数组中提取符合特定条件的元素。
  • 布尔索引和掩码非常适合条件选择和数组数据子集。
  • 在不创建副本的情况下对基础数据进行操作,从而实现高效的就地过滤。

使用布尔数组是使用 NumPy 进行数据分析和处理多维数据的一项关键技能。请继续阅读,我们将通过示例深入探讨此主题。

2、创建布尔数组

在应用布尔索引之前,让我们看看如何在 NumPy 中创建布尔数组或掩码:

import numpy as np

# From a list
bool_arr = np.array([True, False, True])

# Using Boolean NumPy array
mask = np.ones(3, dtype=bool)
mask[1] = False

# Comparison operators
num_arr = np.array([1, 2, 3])
mask = num_arr > 1

print(bool_arr)
# [ True False  True]

print(mask)
# [False  True  True]

我们可以使用列表、比较运算符(如 >、 <、 ==)、NumPy 布尔数组和函数(如 np.ones())来创建布尔掩码。关键点是布尔数组必须与输入数据数组具有相同的形状。

3、NumPy 中的布尔索引

布尔索引允许选择布尔数组/掩码为 True 的数组元素。让我们看一个例子:

import numpy as np

arr = np.array([1, 2, 3, 4])
mask = np.array([True, False, True, False])

result = arr[mask]
print(result)
# [1 3]

这里返回的数组仅包含布尔掩码中与 True 对应的值。

我们还可以使用布尔列表进行索引:

idx = [True, False, True, False]
result = arr[idx]
# [1 3]

关于 NumPy 中布尔索引的一些要点:

  • 布尔数组的长度必须与输入数组上索引的维度相同。
  • 索引支持 1D 布尔数组和 N 维布尔数组,用于沿多个轴进行索引。
  • 布尔索引选择原始数据元素,不进行复制。
  • 超出范围的索引将被忽略。

让我们看一些多维数组上布尔索引的更多示例:

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

# Select second column
mask = np.array([False, True, False])
arr[:, mask]

# [[2]
#  [5]
#  [8]]

# Select first and third row
mask = np.array([True, False, True])
arr[mask, :]

# [[1 2 3]
#  [7 8 9]]

如你所见,布尔数组允许从多维数据中进行灵活选择。

4、布尔索引中的广播

NumPy 布尔索引的一个重要特性是广播。如果布尔数组小于其索引的维度,则会重复以匹配大小。

观察此示例中的广播工作情况:

arr = np.arange(6).reshape(2,3)

print(arr)
# [[0 1 2]
#  [3 4 5]]

mask = np.array([True, False]) # Shape (2,)

arr[mask, :]

# [[0 1 2]   # First row selected
#  [3 4 5]]   # Second row ignored

1D 布尔数组掩码在索引期间隐式重复以匹配 2D 输入数组形状。

了解广播可避免布尔索引中形状不匹配导致的错误。

5、NumPy 中的布尔掩码

布尔掩码应用与布尔索引相同的概念,但使用 NumPy 布尔数组而不是列表:

arr = np.array([1, 2, 3, 4])

bool_mask = (arr % 2 == 0)
# Evaluates to [False, True, False, True]

arr[bool_mask]
# [2, 4]

我们还可以使用 NumPy 逻辑运算符(如 & (AND)、 | (OR))组合掩码:

mask1 = arr > 2
mask2 = arr % 2 == 0

arr[mask1 & mask2]
# [4] Intersection
arr[mask1 | mask2]
# [2, 3, 4] Union

这提供了一种根据布尔条件查询数组的灵活方法。

6、使用布尔掩码分配值

布尔掩码也可用于在 NumPy 数组中分配值:

arr = np.zeros(5, dtype=int)

mask = np.array([True, False, True, True, False])

arr[mask] = 1

print(arr)
# [1 0 1 1 0]

这里我们将 1 分配给 mask 为 True 的索引。

这提供了一种有条件地将值插入数组的有效方法。

7、反转布尔掩码

我们可以使用 ~ 运算符反转布尔掩码:

mask = np.array([True, False, True])

print(~mask)
# [False  True False] // Inverted

当你想要选择元素的补集时,反转掩码很有用。

8、布尔索引的性能

NumPy 布尔索引的一个重要优势是性能。与使用 Python 循环和 if 语句进行条件选择相比,布尔数组可以更快地过滤数组数据。

考虑这个基准:

import numpy as np
import time

size = 1000000
arr = np.random.rand(size)

# NumPy boolean masking
mask = arr > 0.5
%time arr[mask]
# CPU times: user 19 ms, sys: 0 ns, total: 19 ms

# Slow loop version
%time [x for x in arr if x > 0.5]
# CPU times: user 223 ms, sys: 38 ms, total: 261 ms

即使对于大型数组,与原生 Python 条件过滤相比,NumPy 布尔索引也能提供数量级更快的性能。

9、真实世界示例

以下是一些布尔索引和掩码在真实世界数据科学应用中的使用示例:

子集数据

从 DataFrame 中选择年龄 > 30 的行:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],
                   'Age': [25, 45, 35]})

mask = np.array(df['Age'] > 30)
df[mask]
子集统计信息

计算符合条件的子集的统计数据,例如平均收入:

incomes = [50000, 60000, 40000, 70000]
mask = incomes > 50000

incomes[mask].mean() # 60000
图像处理

根据颜色阈值屏蔽像素以进行绿屏处理:

image = load_image()
green_screen_mask = (image[:, :, 1] > 240) & (image[:, :, 2] < 10)

image[green_screen_mask] = [0, 0, 0] # Remove green background

如你所见,布尔索引和掩码在处理实际数据方面有许多应用。

10、结束语

本指南深入介绍了 NumPy 中布尔索引和掩码的基础知识。关键要点是:

  • 布尔索引提供了一种基于布尔条件选择性访问数组元素的强大方法。
  • 广播允许从多维数组中进行矢量化布尔选择。
  • 布尔掩码使用 NumPy 布尔数组通过逻辑条件查询数组。
  • 就地分配可以使用掩码有条件地将数据插入数组。
  • 与 Python 条件过滤相比,布尔索引速度更快。

有很多方法可以使用这些技术进行高效的数组查询和条件数据选择。将布尔索引和掩码与 NumPy 的其他功能(如花式索引、矢量化和广播)相结合,以充分发挥该库对您的数据项目的潜力。


原文链接:NumPy布尔索引 - BimAnt

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2084480.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

0.0 C语言被我遗忘的知识点

文章目录 位移运算(>>和<<)函数指针函数指针的应用场景 strcmp的返回值合法的c语言实数表示sizeof 数组字符串的储存 —— 字符数组与字符指针字符串可能缺少 \0 的情况 用二维数组储存字符串数组其他储存字符串数组的方法 位移运算(>>和<<) 右移(>…

【C++】—— 模版初阶

【C】—— 模版初阶 1 泛型编程 2 函数模板2.1 函数模板基础用法2.2 模板的实例化2.2.1 隐式实例化&#xff08;推导实例化&#xff09;2.2.2 显式实例化 2.3、函数模板的原理2.4、模板参数的匹配原则 3 类模板3.1 类模板的定义格式3.2 实现栈类模板3.3 类模板为何优于 typedef…

部署Alertmanager发送告警

1、Alertmanager简介 Prometheus 对指标的收集、存储与告警能力分属于 Prometheus Server 和 AlertManager 两个独立的组件&#xff0c;前者仅负责定义告警规则生成告警通知&#xff0c; 具体的告警操作则由后者完成。 Alertmanager 负责处理由 Prometheus Server 发来的告警…

【Java设计模式】Builder模式:在Java中清晰构建自定义对象

文章目录 【Java设计模式】Builder模式&#xff1a;在Java中清晰构建自定义对象一、概述二、Builder设计模式的意图三、Builder模式的详细解释及实际示例四、Java中Builder模式的编程示例五、Builder模式类图六、Java中何时使用Builder模式七、Builder模式的优点和权衡八、源码…

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决 一、CoreMark简介二、创建CubeMX项目2.1 选择MCU2.2 配置CPU时钟2.3 配置串口功能2.4 配置LED引脚2.5 生成CMake项目 三、基础功能支持3.1 支持记录耗时3.2 支持printf输出…

三个令人破防的真理

1、所有的人都倡导正义这是不是一件好事呢&#xff1f; 答案肯定是否定的&#xff0c;因为倡导正义不等于践行正义&#xff0c;很多人都倡导&#xff0c;那你做好事是很不容易拿到结果的&#xff0c;相反&#xff0c;你如果做坏事&#xff0c;你是非常容易拿到结果的。 我们的…

stm32f103c8t6 pid算法控制温度详解

目录 1. 硬件准备 必要的硬件组件: 接线示例: 2. PID算法简介 3. 软件实现 初始化和配置 PID控制算法实现 4. 调试和优化 调试步骤: 参数调整技巧: 5. 结论 在使用STM32F103C8T6微控制器进行温度控制时,PID(比例-积分-微分)算法是一种常见且有效的控制方法。…

深度学习——大模型分词

1. 前言 自从chatgpt出现&#xff0c;大模型的发展就进入了快车道&#xff0c;各种各样的大模型卷上天&#xff0c;作为一个在大模型时代的科研人&#xff0c;即使你不向前&#xff0c;也会被时代裹挟着向前&#xff0c;所以还是自己走快一点比较好&#xff0c;免得被后浪拍死…

黑神话悟空配置要求高吗? 配置要求介绍

《黑悟空神话》这款游戏从实机演示中可以看出对配置要求并不低&#xff0c;可以根据当前上市的游戏来推断出该游戏的配置要求。 1、推荐配置&#xff1a; 操作系统:Windows 7, Windows 8.1, Windows 10(均为64位) 处理器: Intel Core i5-6600K / AMD Ryzen 5 1600 内存: 16 …

vue后台项目打包成桌面应用程序(.exe)

目录&#xff08;本项目基于vue2&#xff09; 1、打包成功后的样子​ 2、开发环境 3、开发流程&#xff08;serve build 基础设置 系统托盘&#xff09; 4、插件下载地址 5、打包后的配置文件: 6、镜像 1、打包成功后的样子 2、开发环境 node&#xff1a;14.18.1 elec…

“等保”??到底保什么?简单了解信息安全等级保护

若已部署了畅云管家的企业需要做“等保”&#xff0c; 我们可提供注册等保所需材料 若有需求请咨询所属服务商 等级保护&#xff08;简称“等保”&#xff09; 简单总结&#xff1a;等保就是信息安全等级保护&#xff0c;网络安全法要求网络运营者应当按照网络安全等级保护…

告别复杂编程,低代码平台如何简化列表页多模型数据配置

在现代企业管理和信息系统建设中&#xff0c;随着业务复杂度的不断提升&#xff0c;单一数据模型往往难以满足复杂的数据展示需求。特别是在构建企业级应用或管理平台时&#xff0c;经常需要在一个界面上综合展示来自多个数据模型的信息&#xff0c;以便用户能够更全面地理解业…

OCR智能合同比对工具——快速比对合同差异点

在现代商业活动中&#xff0c;合同是确保交易双方权益和责任的重要法律文件。随着商业活动的复杂性增加&#xff0c;合同版本更新和修订变得越来越频繁。法务、采购等合同经办部门在处理合同时&#xff0c;往往面临着以下挑战&#xff1a; 1.版本一致&#xff1a;随着合同的不…

操作系统面试真题总结(一)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 什么是用户态和内核态 用户态和内核态是操作系统的两种运行状态。…

Redis_AOF持久化

AOF持久化 在AOF持久化的过程中&#xff0c;会以日志的方式记录每个redis“写”命令&#xff0c;并且redis服务器重启时重新执行AOF日志文件中的命令&#xff0c;从而达到“恢复数据”的效果 AOF故障恢复 当redis因发生故障而重启时&#xff0c;redis服务器会按照如下步骤根据…

演绎法推理

cp规则&#xff1a;给前提集合&#xff0c;给结论&#xff0c;要求推导前提推导结论。把结论化成蕴含式&#xff0c;里面的蕴含前件为真拿下来做补充条件&#xff0c;再和前提集合里面那么多条件一起推&#xff0c;最后推出那个结论为真。

【吊打面试官系列-Redis面试题】Redis 的数据类型?

大家好&#xff0c;我是锋哥。今天分享关于 【Redis 的数据类型&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 的数据类型&#xff1f; 答&#xff1a;Redis 支持五种数据类型&#xff1a;string&#xff08;字符串&#xff09;&#xff0c;hash&#x…

常见的服务器容器和漏洞类型汇总

常见的服务器容器和漏洞有哪些&#xff1f;常见的服务器容器包括KubeSphere、Tomcat、Nginx、Apache等&#xff0c;它们在提供便捷的服务部署和灵活的网络功能的同时&#xff0c;也可能存在着一定的安全风险。这些容器的漏洞可能导致数据泄露、权限被非授权访问甚至系统被完全控…

深入京东API世界:商品详情返回值的秘密

京东API世界中的商品详情返回值是一个复杂而精细的数据体系&#xff0c;它承载着商品的全面信息&#xff0c;对于商家、用户以及开发者而言&#xff0c;都具有极高的价值。下面&#xff0c;我们将深入探索京东商品详情API返回值的秘密。 基本结构概述 京东商品详情API的返回值…

【工控】线扫相机小结 第二篇

背景 上一篇中《线扫相机小结》中介绍了一些基础知识和注意事项&#xff0c;这一篇是对上一篇的进一步补充。 会介绍线扫相机的一些调试技巧。 如何在线调试&#xff1f; 我们知道&#xff0c;线扫相机不能像面阵相机一样实时的呈现图像&#xff0c;只能一行行的扫描&#x…