NumPy - 陣列過濾



NumPy 中的陣列過濾

NumPy 中的陣列過濾允許您根據特定條件選擇和處理資料集的子集。此過程可用於提取相關資料、執行條件運算以及分析資料集的子集。

我們可以在 NumPy 中透過建立一個布林陣列(掩碼)來執行過濾,其中每個元素指示原始陣列中相應的元素是否滿足指定條件。然後使用此掩碼索引原始陣列,提取滿足條件的元素。

NumPy 提供了多種透過**布林索引**和**條件運算**過濾陣列的方法。

使用布林索引的基本過濾

布林索引允許您根據條件過濾陣列元素。透過對陣列應用條件,您將獲得一個布林陣列,您可以使用它來索引原始陣列。

示例

在以下示例中,我們從給定陣列中過濾大於值“10”的元素:

import numpy as np

# Creating an array
array = np.array([1, 5, 8, 12, 20, 3])

# Define the condition
condition = array > 10

# Apply the condition to filter the array
filtered_array = array[condition]

print("Original Array:", array)
print("Filtered Array (elements > 10):", filtered_array)

以下是獲得的輸出:

Original Array: [ 1  5  8 12 20  3]
Filtered Array (elements > 10): [12 20]

使用多個條件過濾

使用多個條件過濾允許您從 NumPy 陣列中選擇同時滿足多個條件的元素。這是透過使用以下邏輯運算子組合多個布林條件來實現的:

  • **與(&) -** 選擇滿足兩個條件的元素。
  • **或(|) -** 選擇滿足至少一個條件的元素。
  • **非(~) -** 選擇不滿足條件的元素。

表示組合條件的生成的布林陣列然後用於索引原始陣列,提取滿足所有指定條件的元素。

示例

在此示例中,我們使用多個條件過濾一定範圍內的元素:

import numpy as np

# Creating an array
array = np.array([1, 5, 8, 12, 20, 3])

# Define multiple conditions
condition = (array > 5) & (array < 15)

# Apply the conditions to filter the array
filtered_array = array[condition]

print("Original Array:", array)
print("Filtered Array (5 < elements < 15):", filtered_array)  

這將產生以下結果:

Original Array: [ 1  5  8 12 20  3]
Filtered Array (5 < elements < 15): [ 8 12]

使用函式過濾

使用函式進行過濾時,您通常定義一個函式,該函式以陣列元素作為輸入並返回一個布林值(True 或 False),指示是否應將每個元素包含在結果中。

然後將此函式應用於陣列,生成的布林陣列用於索引和過濾原始資料。

示例:使用 where() 函式過濾

在下面的示例中,我們使用 where() 函式過濾 NumPy 中的元素:

import numpy as np

# Creating an array
array = np.array([1, 5, 8, 12, 20, 3])

# Define the condition
condition = array > 10

# Filter elements
filtered_indices = np.where(condition)
filtered_array = array[filtered_indices]

print("Original Array:", array)
print("Filtered Array (elements > 10) using np.where:", filtered_array)

此函式返回條件為“True”的索引。這些索引用於提取如下所示的過濾元素:

Original Array: [ 1  5  8 12 20  3]
Filtered Array (elements > 10) using np.where: [12 20]

示例:使用自定義函式過濾

讓我們來看一個使用自定義函式根據特定條件過濾陣列的示例:

import numpy as np

# Create a NumPy array
array = np.array([10, 15, 20, 25, 30, 35])

# Define a custom function for filtering
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

# Apply the function to each element of the array
mask = np.array([is_prime(x) for x in array])

# Use the mask to filter the array
filtered_array = array[mask]

print("Original Array:", array)
print("Mask (prime numbers):", mask)
print("Filtered Array (prime numbers):", filtered_array)                                

獲得的輸出如下所示:

Original Array: [10 15 20 25 30 35]
Mask (prime numbers): [False False False False False False]
Filtered Array (prime numbers): []

多維陣列中的過濾

在多維陣列中,可以使用布林索引進行過濾,類似於一維陣列。但是,您需要確保過濾條件已正確應用以處理陣列的維度。

以下是多維陣列中過濾所涉及的步驟:

  • **定義過濾條件 -** 建立應用於陣列中元素的布林條件。這些條件可以基於值或其他標準。
  • **跨維度應用條件 -** 使用這些條件來索引和選擇元素。對於多維陣列,您可能需要處理特定維度的條件或跨所有維度應用條件。

示例

考慮一個 2D 陣列,我們希望根據應用於特定列中元素的條件過濾行:

import numpy as np

# Create a 2D NumPy array
array = np.array([[10, 20, 30],
                  [15, 25, 35],
                  [20, 30, 40]])

# Define a condition for filtering
# Select rows where the value in the second column is greater than 25
condition = array[:, 1] > 25  

# Use the condition to filter the array
filtered_array = array[condition]

print("Original Array:\n", array)
print("Condition (values in second column > 25):", condition)
print("Filtered Array:\n", filtered_array)                               

執行上述程式碼後,我們將獲得以下輸出:

Original Array:
[[10 20 30]
 [15 25 35]
 [20 30 40]]
Condition (values in second column > 25): [False False  True]
Filtered Array:
 [[20 30 40]]
廣告