Для этого можно использовать свертку, например, numpy.convolve
:
import numpy as np
data = np.array([1, 0, 1, 0, 0, 0, 0 ,1, 1, 0, 1, 1])
# this fixes the issue that some patterns look identical
# scores due to the multiplication with 0
# e.g. [1, 0, 1] and [1, 1, 1]
# we just replace the 0 by -1
data[data == 0] = -1
kernel = np.array([0, 0, 0, 1, 1, 0, 1, 1])
# same fix for kernel
kernel[kernel == 0] = -1
res = np.convolve(data,kernel, 'full')
print(res)
# >>> [-1 0 -1 2 1 2 5 -2 -2 -2 -2 0 -5 -2 5 0 -1 2 1]
res = np.convolve(data,kernel, 'same')
print(res)
# >>> [ 2 1 2 5 -2 -2 -2 -2 0 -5 -2 5]
res = np.convolve(data,kernel, 'valid')
print(res)
# >>> [-2 -2 -2 -2 0]
Чем выше результат, тем лучше совпадение. В вашем случае это должно быть равно числу единиц в вашем шаблоне, и индекс можно найти с помощью np.argmax()
.
. Посмотрите на ключевое слово mode
(полное, то же, действительное) и выберите то, что лучше всего подходит для вашего случая.
Существует также scipy.signal.convolve
, что может быть быстрее, если вы обрабатываете много данных.