NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - AI模型在线查看 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 - 3D道路快速建模
NumPy 是用于科学计算和处理多维数组数据的最流行的 Python 库之一。NumPy 提供了强大的功能,可以根据布尔条件从数组中索引和提取元素,这称为布尔索引或掩码。掌握布尔索引和掩码可以使用 NumPy 进行高效的数据操作和分析。
本综合指南将解释你需要了解的有关 NumPy 中布尔索引和掩码的所有信息,包括关键概念、用法和示例,以帮助你在自己的项目中利用这些技术。
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 的其他功能(如花式索引、矢量化和广播)相结合,以充分发挥该库对您的数据项目的潜力。
原文链接:An In-Depth Guide to Boolean Indexing and Masking in NumPy
BimAnt翻译整理,转载请标明出处