Вот один способ с convolution
-
def cross_thresh_convolve(arr, thresh, N):
# Detect if arr crosses thresh for N consecutive times anywhere
return (np.convolve(arr>=thresh,np.ones(N,dtype=int))==N).any()
В качестве альтернативы с binary-dilation
-
from scipy.ndimage.morphology import binary_erosion
def cross_thresh_erosion(arr, thresh, N):
return binary_erosion(arr>=thresh, np.ones(N)).any()
Пробные прогоны -
In [43]: arr1 = np.array([1,2,1,3,4,5,6,7])
...: arr2 = np.array([1,2,1,3,4,2,6,7])
In [44]: print cross_thresh_convolve(arr1, thresh=3, N=4)
...: print cross_thresh_erosion(arr1, thresh=3, N=4)
...: print cross_thresh_convolve(arr2, thresh=3, N=4)
...: print cross_thresh_erosion(arr2, thresh=3, N=4)
True
True
False
False
Общие сравнения
Чтобы охватить общие сравнения, скажем, хотим ли мы искать greater
или less-than
или даже просто сравнить на равенство сзначение, мы могли бы использовать встроенные функции сравнения NumPy, чтобы заменить часть arr>=thresh
из более ранних решений и, следовательно, дать себе общие реализации, например, так: *
def consecutive_comp_convolve(arr, comp, N, comparison=np.greater_equal):
return (np.convolve(comparison(arr,comp),np.ones(N,dtype=int))==N).any()
def consecutive_comp_erosion(arr, comp, N, comparison=np.greater_equal):
return binary_erosion(comparison(arr,comp), np.ones(N)).any()
Следовательно, наш конкретный пример запуска будет -
consecutive_comp_convolve(arr1, comp=3, N=4, comparison=np.greater_equal)
consecutive_comp_erosion(arr1, comp=3, N=4, comparison=np.greater_equal)
consecutive_comp_convolve(arr2, comp=3, N=4, comparison=np.greater_equal)
consecutive_comp_erosion(arr2, comp=3, N=4, comparison=np.greater_equal)