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 的每个值的值. 如果此参数是数组或类似数组,则将其展平. 有关非数组类参数的行为,请参见注释.

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’}, optional

要使用的算法.这不会影响最终结果,但会影响速度和内存使用. 默认值 None 将根据内存考虑因素自动选择.

  • 如果为"sort",将使用基于归并排序的方法. 这将占用大约 6 倍的 elementtest_elements 大小之和的内存使用量,不包括 dtype 的大小.

  • 如果为"table",将使用类似于计数排序的查找表方法. 这仅适用于布尔数组和整数数组. 这将占用 element 的大小加上 test_elements 的最大值减去最小值的内存使用量. 当使用"table"选项时, assume_unique 不起作用.

  • 如果为 None,如果所需的内存分配小于或等于 elementtest_elements 大小之和的 6 倍,则会自动选择"table",否则将使用"sort". 这样做是为了默认情况下不使用大量内存,即使在大多数情况下"table"可能更快. 如果选择"table",则 assume_unique 将不起作用.

返回:
isinndarray, bool

element 具有相同的形状. element[isin] 的值在 test_elements 中.

注释

isin 是 Python 关键字 in 的元素级函数版本.如果 ab 是一维序列,则 isin(a, b) 大致等价于 np.array([item in b for item in a]) .

如果 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]])