Применить функцию к маскированному массиву
У меня есть изображение в виде массива и маска для изображения.
from scipy.misc import face
img = face(gray=True)
mask = img > 250
Как я могу применить функцию ко всем замаскированным элементам?
def foo(x):
return int(x*0.5)
1 ответ
Для этой конкретной функции можно перечислить несколько подходов.
Подход № 1: Вы можете использовать boolean indexing
для установки на месте -
img[mask] = (img[mask]*0.5).astype(int)
Подход № 2: Вы также можете использовать np.where
для возможно более интуитивного решения -
img_out = np.where(mask,(img*0.5).astype(int),img)
С этим np.where
с синтаксисом np.where(mask,A,B)
мы выбираем между двумя массивами одинаковой формы A
а также B
создать новый массив той же формы, что и A
а также B
, Выбор сделан на основе элементов в mask
который снова имеет ту же форму, что и A
а также B
, Таким образом, для каждого True
элемент в mask
мы выбираем A
, иначе B
, Переводя это в нашем случае, A
было бы (img*0.5).astype(int)
а также B
является img
,
Подход № 3: есть встроенный np.putmask
это кажется наиболее близким для этой конкретной задачи и может использоваться для установки на месте, например, так -
np.putmask(img, mask, (img*0.5).astype('uint8'))