NumPy - 数组过滤
NumPy 中的数组过滤
NumPy 中的数组过滤功能允许您根据特定条件选择和处理数据子集。此过程对于提取相关数据、执行条件运算以及分析数据子集非常有用。
我们可以在 NumPy 中通过创建一个布尔数组(掩码)来执行过滤,其中每个元素指示原始数组中对应元素是否满足指定条件。然后,此掩码用于索引原始数组,提取满足条件的元素。
NumPy 提供了多种通过布尔索引和条件运算过滤数组的方法。
使用布尔索引进行基本过滤
布尔索引允许您根据条件过滤数组元素。通过对数组应用条件,您可以获得一个布尔数组,可用于索引原始数组。
示例
在以下示例中,我们从给定数组中筛选出大于值"10"的元素 -
import numpy as np # 创建数组 array = np.array([1, 5, 8, 12, 20, 3]) # 定义条件 condition = array > 10 # 应用条件过滤数组 filtered_array = array[condition] print("原始数组:", array) print("过滤后的数组(元素 > 10):", filtered_array)
以下是获得的输出 -
原始数组:[ 1 5 8 12 20 3] 过滤后的数组(元素 > 10):[12 20]
使用多个条件进行过滤
使用多个条件进行过滤允许您从 NumPy 数组中选择同时满足多个条件的元素。这是通过使用逻辑运算符组合多个布尔条件来实现的,如下所示:-
- AND (&) - 选择同时满足两个条件的元素。
- OR (|) - 选择至少满足其中一个条件的元素。
- NOT (~) - 选择不满足条件的元素。
然后使用表示组合条件的结果布尔数组对原始数组进行索引,提取满足所有指定条件的元素。
示例
在此示例中,我们使用多个条件过滤一定范围内的元素 -
import numpy as np # 创建数组 array = np.array([1, 5, 8, 12, 20, 3]) # 定义多个条件 condition = (array > 5) & (array < 15) # 应用条件过滤数组 filtered_array = array[condition] print("原始数组:", array) print("过滤后的数组 (5 < 元素 < 15):", filtered_array)
这将产生以下结果 -
原始数组:[ 1 5 8 12 20 3] 过滤后的数组 (5 < 元素 < 15):[ 8 12]
使用函数进行过滤
使用函数进行过滤时,通常会定义一个函数,该函数以数组元素作为输入,并返回一个布尔值(True 或 False),指示每个元素是否应包含在结果中。
然后,将此函数应用于数组,并使用生成的布尔数组对原始数据进行索引和过滤。
示例:使用 where() 函数进行过滤
在下面的示例中,我们使用 where() 函数在 NumPy 中过滤元素 -
import numpy as np # 创建数组 array = np.array([1, 5, 8, 12, 20, 3]) # 定义条件 condition = array > 10 # 过滤元素 filtered_indices = np.where(condition) filtered_array = array[filtered_indices] print("原始数组:", array) print("使用 np.where 过滤后的数组(元素 > 10):", filtered_array)
此函数返回条件为"真"的索引。这些索引用于提取过滤后的元素,如下图所示 -
原始数组:[ 1 5 8 12 20 3] 使用 np.where 过滤后的数组(元素 > 10):[12 20]
示例:使用自定义函数过滤
让我们通过一个示例,使用自定义函数根据特定条件过滤数组 -
import numpy as np # 创建一个 NumPy 数组 array = np.array([10, 15, 20, 25, 30, 35]) # 定义一个自定义函数进行过滤 def is_prime(num): """Return True if num is a prime number, False otherwise.""" if num <= 1: return False for i in range(2, int(np.sqrt(num)) + 1): if num % i == 0: return False return True # 将函数应用于数组的每个元素 mask = np.array([is_prime(x) for x in array]) # 使用掩码过滤数组 filtered_array = array[mask] print("原始数组:", array) print("掩码(素数):", mask) print("过滤后的数组(素数):", filtered_array)
输出结果如下 -
原始数组:[10 15 20 25 30 35] 掩码(素数):[False False False False False False] 过滤后的数组(素数):[]
多维数组中的过滤
在多维数组中,可以使用布尔索引进行过滤,类似于一维数组。但是,您需要确保过滤条件能够正确处理数组的维度。
以下是在多维数组中进行过滤的步骤 -
- 定义过滤条件 - 创建应用于数组元素的布尔条件。这些条件可以基于值或其他标准。
- 跨维度应用条件 - 使用这些条件来索引和选择元素。对于多维数组,您可能需要处理特定维度的条件,或将条件应用于所有维度。
示例
考虑一个二维数组,我们希望根据应用于特定列元素的条件来过滤行 -
import numpy as np # 创建二维 NumPy 数组 array = np.array([[10, 20, 30], [15, 25, 35], [20, 30, 40]]) # 定义过滤条件 # 选择第二列值大于 25 的行 condition = array[:, 1] > 25 # 使用条件过滤数组 filtered_array = array[condition] print("原始数组: ", array) print("条件(第二列值 > 25):", condition) print("过滤后的数组: ", filtered_array)
执行上述代码后,我们得到以下输出 -
原始数组: [[10 20 30] [15 25 35] [20 30 40]] 条件(第二列值 > 25):[False False True] 过滤后的数组: [[20 30 40]]