Подход № 1
Мы можем использовать 1D convolution
-
np.flatnonzero(np.convolve(A<t, np.ones(K,dtype=int))==K)[0]-K+1
Идея состоит в том, чтобы получить логический массив после сравнения с пороговым значением, а затем запустить 1D
свертку с ядром длины, равной window
, заполненной 1s
. Это дает нам сумму каждого скользящего окна. Итак, все окна, которые имеют сумму K
, являются теми, которые мы ищем. Используйте flatnonzero
, чтобы получить начальные индексы для действительных окон. Наконец, выберите первый.
Подход № 2
С binary-erosion
-
from scipy.ndimage.morphology import binary_erosion
np.flatnonzero(binary_erosion(A<t, np.ones(K), origin=-(K//2)))[0]
Это запускает скользящее ядро с длиной, равной window
, и стирает все окна, которые не имеют последовательностей window
длины True
, оставляя нас с действительными. Опять же, используйте flatnonzero
, чтобы получить индексы и, наконец, выбрать первый. Нам нужно использовать arg origin
с двоичной эрозией, чтобы мы выбирали пуски.
Подход № 3
Вот еще один с поиском острова -
# Get mask of valid elements with comparison against thresh
mask = np.r_[False,A<t,False]
# Get indices of starts and ends for the valid islands
idx = np.flatnonzero(mask[:-1] != mask[1:])
start,stop = idx[::2],idx[1::2]
# Get the island lengths and check for lengths >=K and mask start indices
# and select the first one among them
out = start[(stop - start)>=K][0]