Python 在子集中对数组元素进行Numpy搜索

Python 在子集中对数组元素进行Numpy搜索,python,numpy,Python,Numpy,假设我有numpy数组 a = np.array([1,3,5,7,9,11,13]) b = np.array([3,5,7,11,13]) 我想创建一个大小为a的布尔数组,其中每个条目都是True或False,这取决于a的元素是否也在b中 所以在这种情况下,我想要 a_b = np.array([False,True,True,True,False,True,True]). 当b由一个元素组成,如a==b[0]时,我可以这样做。当b的长度大于1时,有没有一种快速方法可以做到这一点。使用

假设我有numpy数组

a = np.array([1,3,5,7,9,11,13])
b = np.array([3,5,7,11,13])
我想创建一个大小为a的布尔数组,其中每个条目都是True或False,这取决于a的元素是否也在b中

所以在这种情况下,我想要

a_b = np.array([False,True,True,True,False,True,True]). 
当b由一个元素组成,如a==b[0]时,我可以这样做。当b的长度大于1时,有没有一种快速方法可以做到这一点。

使用:

对于您的数据:

In [674]: np.in1d(a, b)
Out[674]: array([False,  True,  True,  True, False,  True,  True], dtype=bool)
根据文档,这在版本1.4.0或更高版本中可用。这些文档还描述了操作在纯Python中的外观:

对于一维序列,可以将in1d中的
视为python关键字
的元素函数版本<代码>in1d(a,b)
大致相当于
np.array([b中的项表示a中的项])

此函数的文档值得一读,因为其中有
invert
关键字参数和
asike\u unique
关键字参数,这两个参数在某些情况下都非常有用

我还发现使用
np.vectorize
操作符.contains创建自己的版本很有趣:

from operator import contains
v_in = np.vectorize(lambda x,y: contains(y, x), excluded={1,})
然后:

In [696]: v_in([1,2,3, 2], [1, 2])
Out[696]: array([ True,  True, False,  True], dtype=bool)
因为
operator.contains
翻转参数,所以我需要
lambda
使调用约定与您的用例匹配——但是如果可以先使用
b
调用,然后再使用
a
调用,则可以跳过此步骤

但是请注意,您需要使用
excluded
选项进行
vectorize
,因为您希望表示
b
序列(用于检查其成员资格的序列)的任何参数都实际保留为序列(因此,如果您选择不将
包含的
参数与
lambda
一起翻转,则需要排除索引
0
而不是
1

使用
in1d
的方法肯定会快得多,而且是一种更好的方法,因为它依赖于一个众所周知的内置函数。但是知道如何使用
操作符
向量化
有时是很好的

您甚至可以为此创建一个,然后在
中使用
v_作为“中缀”操作:

v_in = Infix(np.vectorize(lambda x,y: contains(y, x), excluded={1,}))
# even easier: v_in = Infix(np.in1d)
用法和示例:

In [702]: v_in([1, 2, 3, 2], [1, 2])
Out[702]: array([ True,  True, False,  True], dtype=bool)

In [704]: [1, 2, 3, 2] <<v_in>> [1, 2]
Out[704]: array([ True,  True, False,  True], dtype=bool)
[702]中的
:v_In([1,2,3,2],[1,2])
Out[702]:数组([True,True,False,True],dtype=bool)
在[704]:[1,2,3,2][1,2]
Out[704]:数组([True,True,False,True],dtype=bool)

太好了,谢谢!如果不是为了这个,我打算使用列表理解。
In [702]: v_in([1, 2, 3, 2], [1, 2])
Out[702]: array([ True,  True, False,  True], dtype=bool)

In [704]: [1, 2, 3, 2] <<v_in>> [1, 2]
Out[704]: array([ True,  True, False,  True], dtype=bool)