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。- 参数:
- element类数组
输入数组。
- test_elements类数组
用于测试 element 中每个值的数组。如果此参数是数组或类数组,则会被展平。有关非类数组参数的行为,请参见注释。
- assume_unique布尔值,可选
如果为 True,则假设输入数组都是唯一的,这可以加快计算速度。默认为 False。
- invert布尔值,可选
如果为 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’,将使用基于 mergesort 的方法。此方法将消耗约 element 和 test_elements 大小总和 6 倍的内存,不包括 dtypes 的大小。
如果为 ‘table’,将使用类似计数排序的查找表方法。这仅适用于布尔值和整数数组。此方法将消耗 element 的大小加上 test_elements 的最大值与最小值之差的内存。 assume_unique 在使用 ‘table’ 选项时无效。
如果为 None,将自动选择 ‘table’(如果所需内存分配小于或等于 element 和 test_elements 大小总和的 6 倍),否则将使用 ‘sort’。这是为了避免默认情况下使用大量内存,尽管 ‘table’ 在大多数情况下可能更快。如果选择了 ‘table’,则 assume_unique 将无效。
- 返回:
- isinndarray,布尔值
形状与 element 相同。 element[isin] 的值存在于 test_elements 中。
备注
isin是 Python 关键字 in 的逐元素函数版本。如果 a 和 b 是 1D 序列,则isin(a, b)大致等同于np.array([item in b for item in a])。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]])