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’}, 可选
要使用的算法。这不会影响最终结果,但会影响速度和内存使用。默认值 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* 的元素级函数版本。如果 *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]])