Python 从排序向量中查找值,这些值也存在于另一个排序向量中

Python 从排序向量中查找值,这些值也存在于另一个排序向量中,python,numpy,scipy,Python,Numpy,Scipy,假设我有两个排序向量(1D numpy ndarrays)A和B。我想找出向量A中的哪些值也存在于向量B中。这将是某个函数的瓶颈,因此我想尽可能快地生成。有一个函数numpy.inad,它正好满足我的需要。它可以通过告诉函数向量中的值是唯一的这一事实来增强。好的,很好。但是排序值呢?我相信知道这些值是经过排序的可以进一步提高性能,因为这将是复杂性O(1)。但是没有理由告诉numpy.INAD向量已排序。。。或者有什么替代方法或技巧可以帮助我吗?也许你可以创建每个向量的集合,然后在集合上使用int

假设我有两个排序向量(1D numpy ndarrays)A和B。我想找出向量A中的哪些值也存在于向量B中。这将是某个函数的瓶颈,因此我想尽可能快地生成。有一个函数numpy.inad,它正好满足我的需要。它可以通过告诉函数向量中的值是唯一的这一事实来增强。好的,很好。但是排序值呢?我相信知道这些值是经过排序的可以进一步提高性能,因为这将是复杂性O(1)。但是没有理由告诉numpy.INAD向量已排序。。。或者有什么替代方法或技巧可以帮助我吗?

也许你可以创建每个向量的集合,然后在集合上使用intersect

我认为向量应该允许建筑从它们出发,比如:

a = set(vectorA)
b = set(vectorB)
commons = a.intersection(b)

np.searchsorted
返回应在不中断排序的情况下放置相应值的位置。如果您的“haystack”数组包含该值,它将在那里。您只需要将这些位置的值与指针进行比较。但要小心越界访问:大于haystack中最大值的指针将生成
索引==len(haystack)
,并将生成
索引器
。您可以使用
np.take(…,mode='clip')
返回此类值的最大值(它将通过相等性测试)

如果您希望
pines
中的大量元素大于
haystack.max()
,则可能需要在搜索之前修剪
pines
,以避免在无关元素上浪费空间

needles = needles[needles <= haystack.max()]

编辑:这个解决方案是
O(N*logM)
N=len(针),M=len(干草堆)
,尽管它没有利用针本身是被分类的事实。您可以在Cython/C中的
O(N+M)
中执行此操作,对于较大的(r)
N

A
set
交叉点,此操作会更快,但是将numpy数组转换为
set
非常慢。(因此,像
numpy.in1d
)来回转换将比实际操作慢得多。我很确定,这将是非常糟糕的性能。1) 我没有从我已经对值进行排序的事实中获益2)我正在从纯Python的静态类型numpy数组转移到动态类型域。然后再回来。所以,好吧。。。不需要。事实上,numpy.intersect1d中有类似的函数,而不需要将Python转换为numpy。但是它不能从排序的值中获益。numpy中的所有集合操作都使用排序
np.in1d
np.intersect1d
都将对两个数组中唯一值的串联进行排序。因此,即使使用预先排序的数组,也无法避免线性性能的下降。您可以通过复制已排序的数组的源代码(文档中有一个链接,numpy中的所有set操作都是用Python完全实现的),从而避免使用已排序的数组。
needles = needles[needles <= haystack.max()]
needles = needles[:np.searchsorted(needles, haystack.max(), side='right')]