NumPy - 陣列搜尋



在 NumPy 中搜索陣列

在 NumPy 中搜索陣列是指查詢滿足特定條件的陣列元素或檢索其索引的過程。

NumPy 提供各種函式來執行搜尋,即使是在大型多維陣列中,它們如下所示:

  • where() 函式
  • nonzero() 函式
  • searchsorted() 函式
  • argmax() 函式
  • argmin() 函式
  • extract() 函式

使用 where() 函式

NumPy 的 where() 函式用於查詢陣列中滿足給定條件的元素的索引。該函式也可用於根據條件替換元素。以下是語法:

np.where(condition, [x, y])

其中:

  • condition − 要檢查的條件。
  • x (可選) − 在條件為真時使用的值。
  • y (可選) − 在條件為假時使用的值。

示例

在以下示例中,我們使用 where() 函式檢索陣列中大於“25”的元素的索引,並用“0”替換小於或等於“25”的陣列元素:

import numpy as np

array = np.array([10, 20, 30, 40, 50])
indices = np.where(array > 25)
print("Indices where array elements are greater than 25:", indices)

# Replacing elements based on condition
modified_array = np.where(array > 25, array, 0)
print("Array after replacing elements <= 25 with 0:", modified_array)

以下是獲得的輸出:

Indices where array elements are greater than 25: (array([2, 3, 4]),)
Array after replacing elements <= 25 with 0: [ 0  0 30 40 50]

使用 nonzero() 函式

NumPy 的 nonzero() 函式用於查詢陣列中所有非零元素的索引。它返回一個數組元組,其中每個陣列包含沿特定維度的非零元素的索引。

當您想過濾掉零元素或識別稀疏陣列中重要元素的位置時,此函式很有用。以下是語法:

numpy.nonzero(a)

其中,a 是要查詢非零元素索引的輸入陣列。

示例

在下面的示例中,我們使用 nonzero() 函式檢索一維陣列中非零元素的索引:

import numpy as np

array = np.array([0, 1, 2, 0, 3, 0, 4])
nonzero_indices = np.nonzero(array)
print("Indices of non-zero elements:", nonzero_indices)

這將產生以下結果:

Indices of non-zero elements: (array([1, 2, 4, 6]),)

使用 searchsorted() 函式

NumPy 的 searchsorted() 函式用於查詢應插入元素以保持排序陣列中順序的索引。

此函式在需要在動態插入元素時保持排序順序的演算法中很有用。以下是語法:

np.searchsorted(sorted_array, values, side='left')

其中:

  • sorted_array − 要搜尋的已排序陣列。
  • values − 要插入的值。
  • side − 如果為“left”,則給出第一個合適位置的索引。如果為“right”,則給出最後一個合適位置的索引。

示例

在此示例中,我們檢索在已排序陣列中插入值“2”、“4”和“6”以保持順序的索引:

import numpy as np

sorted_array = np.array([1, 3, 5, 7, 9])
values = np.array([2, 4, 6])
indices = np.searchsorted(sorted_array, values)
print("Indices where values should be inserted:", indices)

以上程式碼的輸出如下:

Indices where values should be inserted: [1 2 3]

使用 argmax() 函式

NumPy 中的 argmax() 函式用於查詢陣列中沿指定軸的最大值的索引。如果未指定軸,則返回扁平化陣列中最大值的索引。以下是語法:

numpy.argmax(a, axis=None, out=None)

其中:

  • a − 輸入陣列。
  • axis (可選) − 查詢最大值的軸。如果未指定,則在執行操作之前將陣列展平。
  • out (可選) − 將結果儲存到的位置。如果提供,則其形狀必須與預期輸出相同。

示例:在二維陣列中使用 argmax() 函式

在以下示例中,我們使用 argmax() 函式查詢二維陣列中沿指定軸的最大值的索引:

import numpy as np

array = np.array([[10, 15, 5], [7, 12, 20]])
index_of_max_along_axis = np.argmax(array, axis=1)
print("Indices of the maximum values along axis 1:", index_of_max_along_axis)

獲得的輸出如下所示:

Indices of the maximum values along axis 1: [1 2]

示例:在扁平化陣列中使用 argmax() 函式

在這裡,我們使用 argmax() 函式查詢扁平化陣列中最大值的索引:

import numpy as np

array = np.array([[10, 15, 5], [7, 12, 20]])
index_of_max_flattened = np.argmax(array)
print("Index of the maximum value in the flattened array:", index_of_max_flattened)

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

Index of the maximum value in the flattened array: 5

使用 argmin() 函式

NumPy 中的 argmin() 函式用於查詢陣列中沿指定軸的最小值的索引。如果未指定軸,則返回扁平化陣列中最小值的索引。以下是語法:

numpy.argmin(a, axis=None, out=None)

其中:

  • a − 輸入陣列。
  • axis (可選) − 查詢最小值的軸。如果未指定,則在執行操作之前將陣列展平。
  • out (可選) − 將結果儲存到的位置。如果提供,則其形狀必須與預期輸出相同。

示例

在以下示例中,我們使用 argmin() 函式查詢二維陣列中沿指定軸的最小值的索引:

import numpy as np

array = np.array([[10, 15, 5], [7, 12, 2]])
index_of_min_along_axis = np.argmin(array, axis=1)
print("Indices of the minimum values along axis 1:", index_of_min_along_axis)

產生的結果如下:

Indices of the minimum values along axis 1: [2 2]

使用 extract() 函式

NumPy 中的 extract() 函式用於根據布林條件從陣列中提取元素。它返回一個一維陣列,其中只包含輸入陣列中與布林條件中的True值對應的元素。

與返回索引的 np.where() 函式不同,np.extract() 函式直接返回滿足條件的元素。

以下是語法:

numpy.extract(condition, arr)

其中:

  • condition − 指定要提取哪些元素的布林陣列或條件。它必須與 arr 的形狀相同。
  • arr − 要從中提取元素的輸入陣列。

示例

在下面的示例中,我們使用 np.extract() 函式過濾並返回陣列中大於“25”的元素:

import numpy as np

array = np.array([10, 20, 30, 40, 50])
condition = array > 25
extracted_elements = np.extract(condition, array)
print("Elements greater than 25:", extracted_elements)

我們得到如下所示的輸出:

Elements greater than 25: [30 40 50]

使用布林索引進行搜尋

NumPy 中的布林索引用於根據特定條件搜尋和過濾陣列。它涉及建立一個布林陣列(或掩碼),其中每個值根據是否滿足條件而為TrueFalse

然後,此布林陣列用於索引到原始陣列中,僅提取條件為True的那些元素。

示例

以下是如何在 NumPy 中使用布林索引根據條件過濾元素的簡單示例:

import numpy as np

array = np.array([10, 20, 30, 40, 50])
boolean_mask = array > 25
filtered_array = array[boolean_mask]
print("Filtered array (elements > 25):", filtered_array)

我們得到如下所示的輸出:

Filtered array (elements > 25): [30 40 50]
廣告