numpy.isin#

numpy.isin(element, test_elements, assume_unique=False, invert=False, *, kind=None)[原始碼]#

計算 element in test_elements,僅針對 element 進行廣播。 傳回與 element 形狀相同的布林陣列,如果 element 的元素在 test_elements 中則為 True,否則為 False。

參數:
elementarray_like

輸入陣列。

test_elementsarray_like

用來測試 element 每個值的數值。如果此引數是陣列或 array_like,則會被展平。 有關非類陣列參數的行為,請參閱註解。

assume_uniquebool,選用

如果為 True,則假設輸入陣列都是唯一的,這可以加快計算速度。預設值為 False。

invertbool,選用

如果為 True,則傳回陣列中的值會被反轉,如同計算 element not in test_elements。預設值為 False。np.isin(a, b, invert=True) 等效於(但速度更快) np.invert(np.isin(a, b))

kind{None, ‘sort’, ‘table’},選用

要使用的演算法。這不會影響最終結果,但會影響速度和記憶體使用量。 預設值 None 將根據記憶體考量自動選擇。

  • 如果為 ‘sort’,將使用基於合併排序的方法。這將佔用大約 6 倍於 elementtest_elements 大小總和的記憶體使用量,不包括 dtype 的大小。

  • 如果為 ‘table’,將使用類似於計數排序的查找表方法。這僅適用於布林和整數陣列。 這將佔用 element 大小加上 test_elements 最大值-最小值 的記憶體使用量。當使用 ‘table’ 選項時,assume_unique 沒有效果。

  • 如果為 None,如果所需的記憶體分配小於或等於 6 倍於 elementtest_elements 大小總和,則會自動選擇 ‘table’,否則將使用 ‘sort’。 這樣做的目的是預設不使用大量記憶體,即使在大多數情況下 ‘table’ 可能更快。 如果選擇 ‘table’,則 assume_unique 將沒有效果。

傳回值:
isinndarray,bool

具有與 element 相同的形狀。值 element[isin]test_elements 中。

註解

isin 是 python 關鍵字 in 的元素級函數版本。isin(a, b) 大致等效於 np.array([item in b for item in a]),如果 ab 是一維序列。

如果 elementtest_elements 尚不是陣列,則會將其轉換為陣列。 如果 test_elements 是一個集合(或其他非序列集合),它將被轉換為具有一個元素Object 陣列,而不是包含在 test_elements 中的值的陣列。 這是 array 建構子處理非序列集合方式的結果。 將集合轉換為列表通常會產生所需的行為。

如果以下關係成立,則使用 kind='table' 往往比 kind=’sort’ 更快: log10(len(test_elements)) > (log10(max(test_elements)-min(test_elements)) - 2.27) / 0.927,但可能會使用更多的記憶體。 kind 的預設值將僅根據記憶體使用量自動選擇,因此如果可以放寬記憶體限制,則可以手動設定 kind='table'

範例

>>> import numpy as np
>>> element = 2*np.arange(4).reshape((2, 2))
>>> element
array([[0, 2],
       [4, 6]])
>>> test_elements = [1, 2, 4, 8]
>>> mask = np.isin(element, test_elements)
>>> mask
array([[False,  True],
       [ True, False]])
>>> element[mask]
array([2, 4])

可以使用 nonzero 取得匹配值的索引

>>> np.nonzero(mask)
(array([0, 1]), array([1, 0]))

測試也可以反轉

>>> mask = np.isin(element, test_elements, invert=True)
>>> mask
array([[ True, False],
       [False,  True]])
>>> element[mask]
array([0, 6])

由於 array 處理集合的方式,以下操作不會如預期般運作

>>> test_set = {1, 2, 4, 8}
>>> np.isin(element, test_set)
array([[False, False],
       [False, False]])

將集合轉換為列表會產生預期的結果

>>> np.isin(element, list(test_set))
array([[False,  True],
       [ True, False]])