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 > 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

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值