Python numpy中是否有方法验证一个数组是否包含在另一个数组中?

Python numpy中是否有方法验证一个数组是否包含在另一个数组中?,python,numpy,Python,Numpy,我想验证numpy数组是否是另一个数组中的连续序列 例如 预期结果将是: is_sequence_of(b, a) # should return True is_sequence_of(c, a) # should return False 我想知道是否有一种numpy方法可以做到这一点。方法#1 我们可以使用带有np.searchsorted- def isin_seq(a,b): # Look for the presence of b in a, while keeping t

我想验证numpy数组是否是另一个数组中的连续序列

例如

预期结果将是:

is_sequence_of(b, a) # should return True
is_sequence_of(c, a) # should return False
我想知道是否有一种numpy方法可以做到这一点。

方法#1

我们可以使用带有
np.searchsorted
-

def isin_seq(a,b):
    # Look for the presence of b in a, while keeping the sequence
    sidx = a.argsort()
    idx = np.searchsorted(a,b,sorter=sidx)
    idx[idx==len(a)] = 0
    ssidx = sidx[idx]
    return (np.diff(ssidx)==1).all() & (a[ssidx]==b).all()
注意,这假设输入数组没有重复项

样本运行-

In [42]: isin_seq(a,b) # search for the sequence b in a
Out[42]: True

In [43]: isin_seq(c,b) # search for the sequence b in c
Out[43]: False
方法#2

另一个带有
skimage.util.view\u as\u窗口的-

from skimage.util import view_as_windows

def isin_seq_v2(a,b):
    return (view_as_windows(a,len(b))==b).all(1).any()
方法#3

这也可能被视为模板匹配问题,因此,对于整数,我们可以使用OpenCV的内置函数进行
模板匹配
:(受启发),如下所示-

import cv2 
from cv2 import matchTemplate as cv2m

def isin_seq_v3(arr,seq):
    S = cv2m(arr.astype('uint8'),seq.astype('uint8'),cv2.TM_SQDIFF)
    return np.isclose(S,0).any()
from numba import njit

@njit
def isin_seq_numba(a,b):
    m = len(a)
    n = len(b)
    for i in range(m-n+1):
        for j in range(n):
            if a[i+j]!=b[j]:
                break                
        if j==n-1:
            return True
    return False
方法#4

我们的方法可以通过基于
短路
的方法获益。因此,我们将使用一个带有
numba
的函数来提高性能效率,如下所示-

import cv2 
from cv2 import matchTemplate as cv2m

def isin_seq_v3(arr,seq):
    S = cv2m(arr.astype('uint8'),seq.astype('uint8'),cv2.TM_SQDIFF)
    return np.isclose(S,0).any()
from numba import njit

@njit
def isin_seq_numba(a,b):
    m = len(a)
    n = len(b)
    for i in range(m-n+1):
        for j in range(n):
            if a[i+j]!=b[j]:
                break                
        if j==n-1:
            return True
    return False

这测试的内容与问题要求的内容不同。新版本也不起作用。在其他问题中,它们忽略了
b
的顺序。我会展示一个isin_seq
的演示,但Ideone没有skimage。不过,新的
isin_seq_v2
应该可以工作。注意事项不太正确,因为问题会发生,而不仅仅是针上有重复的。(还有,我不知道你把haystack作为第一个论点而不是第二个论点,所以我前面的例子把论点倒过来了。)相关吗?