过滤 NumPy 数组中的元素

Vaibhav Vaibhav 2023年1月30日
  1. 在 NumPy 中使用 fromiter() 方法过滤元素
  2. 在 NumPy 中使用布尔掩码切分方法过滤元素
  3. 在 NumPy 中使用 where() 方法过滤元素
过滤 NumPy 数组中的元素

通常,我们需要特定的数组值,通常是升序或降序。有时,我们还必须从数组中搜索元素,然后检索它们或根据某些条件过滤某些值。

本文将介绍如何从 NumPy 数组中过滤数值。

在 NumPy 中使用 fromiter() 方法过滤元素

fromiter() 从可迭代对象创建一个新的一维数组,该数组作为参数传递。我们可以将条件应用于输入数组元素,然后进一步将该函数赋予该新数组,以在 NumPy 数组中获取所需的元素。

fromiter() 方法的语法如下。

fromiter(iterable, dtype, count, like)

它具有以下参数。

  • iterable - 函数将对其进行迭代的可迭代对象。
  • dtype - 此参数引用返回数组的数据类型。
  • count - 这是一个可选的整数参数,它表示将在可迭代对象中读取的元素数。此参数的默认值为 -1,表示将读取所有元素。
  • like - 这是一个可选的布尔参数。它控制返回数组的定义。

在 NumPy 中使用 fromiter() 方法过滤元素的方法如下。

import numpy as np

myArray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
newArray = np.fromiter(
    (element for element in myArray if element < 6), dtype=myArray.dtype
)
print(myArray)
print(newArray)

输出:

[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5]

首先,我们初始化一个 NumPy 数组,我们希望从该数组中过滤元素。然后,我们遍历整个数组并过滤出小于 6 的值。然后,我们将此新数组转换为与原始数组具有相同数据类型的 NumPy 数组。

要了解有关此方法的更多信息,请参考其官方文档

在 NumPy 中使用布尔掩码切分方法过滤元素

这种方法有点怪异,但在 NumPy 中却像是一种魅力。我们必须提到数组后方括号 [] 内的条件。然后 NumPy 将根据条件过滤掉元素并返回一个新的过滤数组。

这个概念可能不清楚,甚至对于某些人来说似乎很棘手,但请不要担心。我们在下面有一些示例来对其进行更好的解释。

import numpy as np

myArray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
newArray1 = myArray[myArray < 6]  # Line 1
newArray2 = myArray[myArray % 2 == 0]  # Line 2
newArray3 = myArray[myArray % 2 != 0]  # Line 3
newArray4 = myArray[np.logical_and(myArray > 1, myArray < 5)]  # Line 4
newArray5 = myArray[np.logical_or(myArray % 2 == 0, myArray < 5)]  # Line 5
print(myArray)
print(newArray1)
print(newArray2)
print(newArray3)
print(newArray4)
print(newArray5)

输出:

[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5]
[2 4 6 8]
[1 3 5 7 9]
[2 3 4]
[1 2 3 4 6 8]

如上所述,我们在方括号之间添加了一些条件,并根据这些条件对目标数组进行了过滤。存储数组的变量(在本例中为 myArray)代表方括号内数组的单个元素。

为了应用多个条件并使用逻辑运算符,我们分别使用两种 NumPy 方法,分别对逻辑 andor 使用 logical_and()logical_or()

  • myArray < 6 - 过滤小于 6 的值
  • myArray % 2 == 0 - 过滤可被 2 整除的值
  • myArray % 2 != 0 - 过滤不能被 2 整除的值
  • np.logical_and(myArray > 1, myArray < 5) - 过滤大于 1 且小于 5 的值。
  • np.logical_or(myArray % 2 == 0, myArray < 5) - 过滤可被二整除或小于五的值。

在 NumPy 中使用 where() 方法过滤元素

这是最后一个方法,它使用 [NumPy 库中的 where() 方法)。它根据条件从目标数组中筛选元素,并返回已筛选元素的索引。

你也可以使用此方法来更改满足条件的元素的值。

where() 方法的语法如下所示。

where(condition, x, y)

它具有以下参数。

  • condition - 这是布尔条件,要检查数组的每个元素。
  • x - 它是赋予满足条件的元素的值或满足条件的元素上进行的计算。
  • y - 它是赋予不满足条件的元素的值或对不满意元素进行的计算。

让我们看看如何使用此函数过滤掉元素。

import numpy as np

myArray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
newArray1 = myArray[np.where(myArray < 7)[0]]
newArray2 = myArray[np.where(myArray % 2 == 0)[0]]
newArray3 = myArray[np.where(myArray % 2 != 0)[0]]
print(myArray)
print(newArray1)
print(newArray2)
print(newArray3)

输出:

[1 2 3 4 5 6 7 8 9]
[1 2 3 4 5 6]
[2 4 6 8]
[1 3 5 7 9]

在以上代码段中,所有满足条件的元素都以数组形式返回。

where() 函数返回 NumPy 数组的元组。因此,我们只考虑第一个数组,这就是我们的答案。

如上所述,你还可以分配自定义值,并在元素满足指定条件时和不满足条件时对元素执行自定义操作。

下面是一个例子。

import numpy as np

myArray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
newArray1 = np.where(myArray < 7, 5, -1)
newArray2 = np.where(myArray % 2 == 0, myArray ** 2, 0)
newArray3 = np.where(myArray % 2 != 0, myArray, -1)
newArray4 = np.where(myArray % 2 != 0, myArray, myArray)
newArray5 = np.where(myArray % 2 != 0, 0, myArray)
print(myArray)
print(newArray1)
print(newArray2)
print(newArray3)
print(newArray4)
print(newArray5)

输出:

[1 2 3 4 5 6 7 8 9]
[ 5  5  5  5  5  5 -1 -1 -1]
[ 0  4  0 16  0 36  0 64  0]
[ 1 -1  3 -1  5 -1  7 -1  9]
[1 2 3 4 5 6 7 8 9]
[0 2 0 4 0 6 0 8 0]

看一下输出。查看元素如何根据条件以及根据你提供的用于操纵 where() 函数的元素提供的值和计算而变化。

作者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.