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 倍於 element 和 test_elements 大小總和的記憶體使用量,不包括 dtype 的大小。
如果為 ‘table’,將使用類似於計數排序的查找表方法。這僅適用於布林和整數陣列。 這將佔用 element 大小加上 test_elements 最大值-最小值 的記憶體使用量。當使用 ‘table’ 選項時,assume_unique 沒有效果。
如果為 None,如果所需的記憶體分配小於或等於 6 倍於 element 和 test_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])
,如果 a 和 b 是一維序列。如果 element 和 test_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]])