Использование масок (логических массивов) является эффективным, а также экономит память и производительность. Мы будем использовать SciPy's binary-dilation
для расширения пороговой маски.
Вот пошаговая установка и запуск решения -
In [42]: # Random data setup
...: np.random.seed(0)
...: dt_diff = np.random.rand(20)
...: dt_temp_th = 0.9
In [43]: # Get mask of threshold crossings
...: mask = dt_diff > dt_temp_th
In [44]: mask
Out[44]:
array([False, False, False, False, False, False, False, False, True,
False, False, False, False, True, False, False, False, False,
False, False])
In [45]: W = 3 # window size for extension (edit it according to your use-case)
In [46]: from scipy.ndimage.morphology import binary_dilation
In [47]: extm = binary_dilation(mask, np.ones(W, dtype=bool), origin=-(W//2))
In [48]: mask
Out[48]:
array([False, False, False, False, False, False, False, False, True,
False, False, False, False, True, False, False, False, False,
False, False])
In [49]: extm
Out[49]:
array([False, False, False, False, False, False, False, False, True,
True, True, False, False, True, True, True, False, False,
False, False])
Сравнить mask
против extm
, чтобы увидеть, как происходит расширение.
Как мы видим, пороговое значение mask
расширяется на размер окна W
с правой стороны, как и ожидаемая маска вывода extm
. Это можно использовать для маскировки входных данных в массиве: dt_diff[~extm]
для имитации удаления / удаления элементов из входных данных, следующих за boolean-indexing
или наоборот dt_diff[extm]
для имитации выбора этих элементов.
Альтернативы с функциями NumPy
Альтернатива # 1
extm = np.convolve(mask, np.ones(W, dtype=int))[:len(dt_diff)]>0
Альтернатива # 2
idx = np.flatnonzero(mask)
ext_idx = (idx[:,None]+ np.arange(W)).ravel()
ext_mask = np.ones(len(dt_diff), dtype=bool)
ext_mask[ext_idx[ext_idx<len(dt_diff)]] = False
# Get filtered o/p
out = dt_diff[ext_mask]