Numpy布尔索引与掩码

2024-08-29 10:28
文章标签 索引 布尔 掩码 numpy

本文主要是介绍Numpy布尔索引与掩码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 > 1print(bool_arr)
# [ True False  True]print(mask)
# [False  True  True]

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

3、NumPy 中的布尔索引

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

import numpy as nparr = 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 == 0arr[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] = 1print(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 timesize = 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 npdf = 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 > 50000incomes[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

这篇关于Numpy布尔索引与掩码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117599

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

贝壳面试:什么是回表?什么是索引下推?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50+)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题: 1.谈谈你对MySQL 索引下推 的认识? 2.在MySQL中,索引下推 是如何实现的?请简述其工作原理。 3、说说什么是 回表,什么是 索引下推 ? 最近有小伙伴在面试 贝壳、soul,又遇到了相关的

Mysql高级篇(中)——索引介绍

Mysql高级篇(中)——索引介绍 一、索引本质二、索引优缺点三、索引分类(1)按数据结构分类(2)按功能分类(3) 按存储引擎分类(4) 按存储方式分类(5) 按使用方式分类 四、 索引基本语法(1)创建索引(2)查看索引(3)删除索引(4)ALTER 关键字创建/删除索引 五、适合创建索引的情况思考题 六、不适合创建索引的情况 一、索引本质 索引本质 是 一种数据结构,它用

通配符掩码

1. 基本概念 在计算机网络中,通配符掩码(Wildcard Mask)通常与子网掩码一起使用,用于在配置网络设备(如路由器或交换机)时指定要匹配的IP地址范围。通配符掩码实际上是子网掩码的反码(bitwise NOT)。 子网掩码用于指定IP地址中的哪些位表示网络部分,哪些位表示主机部分。通配符掩码则用于指定在路由或访问控制列表(ACL)中哪些位必须匹配,哪些位可以忽略。 2. 通配符掩码

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询数据

ElasticSearch 6.1.1 通过Head插件,新建索引,添加文档,及其查询; 一、首先启动相关服务: 二、新建一个film索引: 三、建立映射: 1、通过Head插件: POST http://192.168.1.111:9200/film/_mapping/dongzuo/ {"properties": {"title": {"type":

ElasticSearch 6.1.1运用代码添加索引及其添加,修改,删除文档

1、新建一个MAVEN项目:ElasticSearchTest 2、修改pom.xml文件内容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or

postgres数据库中如何看查询是否走索引,以及在什么情况下走索引

在 PostgreSQL 中,可以通过 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。 1. 如何查看查询是否使用索引 使用 EXPLAIN 查看查询计划 EXPLAIN 显示 PostgreSQL 如何执行查询,包括是否使用索引。 EXPLAIN SELECT * FROM users WH

数据库系统 第42节 数据库索引简介

数据库索引是数据库表中一个或多个列的数据结构,用于加快数据检索速度。除了基础的B-Tree索引,其他类型的索引针对特定的数据类型和查询模式提供了优化。以下是几种不同类型的索引及其使用场景的详细说明和示例代码。 1. 位图索引 (Bitmap Index) 位图索引适用于具有少量不同值的列(例如性别、国家代码等),它使用位图来表示数据,从而提高查询效率。 适用场景:当列中的值域较小,且数据分布

python科学计算:NumPy 线性代数与矩阵操作

1 NumPy 中的矩阵与数组 在 NumPy 中,矩阵实际上是一种特殊的二维数组,因此几乎所有数组的操作都可以应用到矩阵上。不过,矩阵运算与一般的数组运算存在一定的区别,尤其是在点积、乘法等操作中。 1.1 创建矩阵 矩阵可以通过 NumPy 的 array() 函数创建。矩阵的形状可以通过 shape 属性来访问。 import numpy as np# 创建一个 2x3 矩阵mat

探索Python的数学魔法:Numpy库的神秘力量

文章目录 探索Python的数学魔法:Numpy库的神秘力量背景:为什么选择Numpy?Numpy是什么?如何安装Numpy?五个简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python的数学魔法:Numpy库的神秘力量 背景:为什么选择Numpy? 在Python的世界中,数据处理和科学计算是不可或缺的一部分。但原生Python在处理大规模数据时可能会显