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 倍的 element 和 test_elements 大小之和的内存,不包括 dtype 的大小.
如果为 ‘table’,将使用类似于计数排序的查找表方法.这仅适用于布尔和整数数组.这将占用 element 的大小加上 test_elements 的最大值减最小值的内存空间.当使用 ‘table’ 选项时, assume_unique 不起作用.
如果为 None,则当所需内存分配小于或等于 element 和 test_elements 大小之和的 6 倍时,将自动选择 ‘table’,否则将使用 ‘sort’.这样做是为了默认情况下不使用大量内存,即使在大多数情况下 ‘table’ 可能更快.如果选择 ‘table’,则 assume_unique 将不起作用.
- 返回:
- isinndarray, bool
具有与 element 相同的形状.值 element[isin] 在 test_elements 中.
注释
isin是 python 关键字 in 的逐元素函数版本. 如果 a 和 b 是 1-D 序列,则isin(a, b)大致等同于np.array([item in b for item in a]).如果 element 和 test_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'.示例
>>> 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]])