過濾 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.