编辑以下代码允许执行基于卷积的相等检查.它将True映射为1,将False映射为-1.它还会反转b,这是正常工作所需的:
def search(a, b) :
return np.where(np.round(fftconvolve(a * 2 - 1, (b * 2 - 1)[::-1],
mode='valid') - len(b)) == 0)[0]
我已经检查过它为各种随机输入提供了与as_strided方法相同的输出.我也有时间接近,并且卷积只开始用大约256个项目的大量搜索令牌付出代价.
看起来有点矫枉过正,但是使用布尔数据你可以使用(滥用?)卷积:
In [8]: np.where(np.convolve(may_a, may_b.astype(int),
...: mode='valid') == may_b.sum())[0]
Out[8]: array([2, 7])
对于较大的数据集,使用scipy.signal.fftconvolve可能会更快:
In [13]: np.where(scipy.signal.fftconvolve(may_a, may_b,
....: mode='valid') == may_b.sum())[0]
Out[13]: array([2, 7])
你必须要小心,因为输出现在是浮点数,舍入可能会破坏相等性检查:
In [14]: scipy.signal.fftconvolve(may_a, may_b, mode='valid')
Out[14]: array([ 1., 1., 2., 1., 1., 1., 1., 2.])
因此,你可能会对以下内容更好:
In [15]: np.where(np.round(scipy.signal.fftconvolve(may_a, may_b, mode='valid') -
....: may_b.sum()) == 0)[0]
Out[15]: array([2, 7])