如何在 NumPy 数组中识别非零元素?

2025年1月5日 | 阅读6分钟

引言

在科学计算和数据分析中,查找 NumPy 数组中的非零元素是一项常见的任务。NumPy 提供了有效的方法来完成此任务,使您能够轻松地查找和操作相关数据点。

可以使用布尔索引来确定 NumPy 数组中的哪些元素是非零的。通过利用 NumPy 的数组操作,此方法会生成一个布尔掩码,当原始数组中的对应元素非零时,每个元素都为 True,否则为 False。通过应用此掩码,您可以提取非零元素或仅对这些元素执行操作。

可以执行此操作的一个函数是 numpy.nonzero()。它返回一个数组元组,每个数组包含特定轴上非零元素的索引。在搜索多维数组以查找跨特定维度的非零值时,这非常有帮助。

NumPy 通过有效地识别非零元素,使得快速操作和分析数据成为可能。这对于各种应用至关重要,从简单的数组操作到复杂的统计计算和机器学习技术。

确定 NumPy 数组中哪些元素非零的技巧

使用 any() 函数

Python 的 any() 方法是评估可迭代对象的有效工具,包括列表、元组和 NumPy 数组。如果可迭代对象至少有一次评估为 True,则返回 True;否则返回 False。通过检测真值而无需显式循环或条件,此函数可以简化逻辑过程。
NumPy 中的 any() 在数组操作中特别有用,您需要快速验证跨元素的条件。例如,可以使用它来检查数组是否包含任何非零成员(numpy.any(array!= 0))或查看是否有任何元素满足特定要求(numpy.any(array > 10))。此函数利用 NumPy 对大型数据集的优化操作来提高代码的性能和可读性。

语法

示例

输出

Array: [0 0 5 0 0]
Do we have any non-zero elements? True

说明

以下是如何使用 NumPy 的 np.any() 函数来确定给定 NumPy 数组 arr = np.array([0, 0, 5, 0, 0]) 中的任何元素是否非零的示例。这是它的工作原理:通过使用短语 arr!= 0 创建一个布尔数组,其中每个元素在 arr 中对应元素非零时为 True(5 产生 True,而零产生 False)。此布尔数组的 np.any() 函数检查它是否至少有一个 True 值,这表明存在非零条目。在这种情况下,由于 arr 确实包含非零值 5,因此条件 np.any(arr!= 0) 的计算结果为 True。这简要地演示了 np.any() 在快速评估大型数据集上的条件时的有用性和有效性,表明它对于从基本数组操作到科学计算和数据分析工作流中复杂的按数据过滤和验证的任务至关重要。

使用 argwhere() 函数

当确定满足给定标准的数组元素的索引时,NumPy 的 argwhere() 方法是一个非常有用的工具。它返回一个 NumPy 数组,其中包含布尔上下文中为 True 或非零的元素的索引。此函数在提取多维数组中满足特定条件的元素的索引时尤其有用。例如,使用 np.argwhere(array > 5) 获取数组中大于 5 的所有元素的索引。每个元组表示一个合格元素的索引,这就是结果的格式。argwhere() 使查找数组中的特定数据点变得更容易,从而使其更容易执行诸如过滤数据、提取元素以及然后使用这些索引进行分析或修改之类的操作。

语法

condition 是一个表现得像布尔数组或产生布尔数组的条件的表达式。

设置参数

circumstances: 任何看起来像布尔数组的表达式都可以用作此参数。它概述了返回索引的前提条件。

返回值

满足给定条件的索引数组。返回一个形状为 (n, arr.ndim) 的 NumPy 数组,其中 n 是满足条件的元素数量,arr.ndim 是输入数组 arr 的维度数量。

示例

输出

The elements of the array data are: [4 0 0 1 9 0 2 0 5 8 0 3]
Non-zero elements in the array data:
 [[4]
 [1]
 [9]
 [2]
 [5]
 [8]
 [3]]
Indices of non-zero elements in the array data:
 [[ 0]
 [ 3]
 [ 4]
 [ 6]
 [ 8]
 [ 9]
 [11]]

说明

提供的代码中定义了一个包含零和非零元素混合数据的 NumPy 数组。函数 np.argwhere(data) 确定数组非零成员的索引。变量 non_zero_indices 包含这些索引。然后,代码使用 data[non_zero_indices] 语法打印原始数组、非零条目及其对应的索引。此过程有效地查找并打印数组非零项的值和位置,从而允许进行进一步的数据操作或分析。

利用 where() 函数

NumPy 中用于逐元素条件操作的有用工具之一是 where() 函数。它根据条件从两个数组中返回选定的元素。如果满足条件(True),则选择第一个数组的元素;否则,则选择第二个数组的元素。此函数对于快速实现逐元素更改、过滤数据和创建掩码非常有用。例如,当使用 np.where(array > 0, array, -1) 时,数组中的正数元素被自身替换,非正数元素被 -1 替换。where() 函数提供了一种清晰易懂的条件选择元素的方法,从而提高了数据操作的能力。

语法

说明

condition: 一个看起来像数组的对象,用作选择的条件。

x: 当条件为真时,选择此数组的值。

y: 当条件为假时,选择此数组的值。

示例

输出

Non-zero elements are present in the array.
Indices of non-zero elements: (array([9]),)
Non-zero elements in the array: [1]

说明

提供的代码中定义了一个主要包含零元素和一个非零元素 (1) 的 NumPy 数组 data。可以使用 np.where(data!= 0) 函数找到非零元素的索引。此函数返回一个元组,其中包含谓词 (data!= 0) 为真的索引数组。为了确定元组中是否存在任何非零条目,会检查第一个数组的大小。然后打印任何非零元素的值和索引。此方法有效地查找并验证数组中是否存在非零条目,从而更容易进一步操作或分析数据。

结论

总之,在 NumPy 数组中查找非零元素是科学计算和数据分析的重要职责之一。借助 np.any()、np.argwhere() 和 np.where() 等函数,可以有效地完成此任务。np.argwhere() 函数返回非零元素的索引,np.where() 允许对数组元素进行条件选择和操作,而 np.any() 则确定是否存在任何非零元素。这些功能增强了数据操作能力,使得能够快速有效地处理大型数据集。理解和应用这些函数对于在各种计算应用中进行高效的数据转换、验证和过滤至关重要。
为了有效处理数据,请熟练掌握 np.any()、np.argwhere() 和 np.where() 这三个 NumPy 函数。它们通过支持全面的数据处理、过滤和转换,提高了整体效率和准确性——所有这些对于机器学习、科学计算和其他计算任务都至关重要。