Создать маску из массива на основе порогаPython

Программы на Python
Ответить
Anonymous
 Создать маску из массива на основе порога

Сообщение Anonymous »

У меня есть массив, и я хочу создать маску для этого массива на основе порогового значения. Извините, если объяснение немного запутанное.
Первый шаг — найти интервалы элементов, превышающие половину порогового значения, затем, если максимальное значение в этих интервалах превышает пороговое значение, все эти элементы помечаются как 1..
Однако, если имеется менее 10 элементов, которые находятся ниже половины порогового значения, но между двумя интервалы выше половины порога, все они помечены как 1.
Это MWE с 2 примерами:

Код: Выделить всё

import numpy as np

example1 = np.array([0, 0, 5, 5, 5, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 10, 10, 5, 5, 0, 0])
# mask_example1 = np.array([0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0.])
example2 = np.array([0, 0, 5, 5, 5, 3, 3, 3, 3, 3, 5, 5, 5, 3, 3, 3, 5, 5, 5, 5, 0, 0])
# mask_example2 = np.array([0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0.])
example3 = np.array([0, 0, 5, 5, 5, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 10, 10, 5, 5, 0, 0])
# mask_example3 = np.array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 1., 0., 0.])

def find_mask(val_array, thresh=8.0):
half_thresh = thresh / 2

mask = np.zeros(len(val_array))

idxs_above_half_thresh = np.where(val_array >= half_thresh)[0]

# the +1 is to include the upper limit of the band
bands_idxs_above_half_thresh = np.split(
idxs_above_half_thresh,
np.where(np.diff(idxs_above_half_thresh) != 1)[0] + 1
)

for band in bands_idxs_above_half_thresh:
band_max = np.max(val_array[band])
if band_max >= thresh:
mask[band] = 1

for idx, band in enumerate(bands_idxs_above_half_thresh[1:]):
prev = bands_idxs_above_half_thresh[idx+1-1]
dist = np.abs(prev[-1] - band[0])
if 1 < dist  

Подробнее здесь: [url]https://stackoverflow.com/questions/79835202/create-mask-from-array-based-on-threshold[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»