numpy.isin#

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

计算 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’}, 可选

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

  • 如果为 ‘sort’,则使用基于归并排序的方法。这将使用大约 elementtest_elements 大小总和 6 倍的内存,不包括数据类型的大小。

  • 如果为 ‘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 的逐元素函数版本。 isin(a, b) 大致等同于 np.array([item in b for item in a]),如果 ab 是 1 维序列。

elementtest_elements 如果不是数组,则会被转换为数组。如果 test_elements 是集合(或其他非序列集合),它将被转换为只有一个元素的对象数组,而不是包含在 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'

版本 1.13.0 中的新功能。

示例

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