Применить функцию к маскированному массиву

У меня есть изображение в виде массива и маска для изображения.

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'))
Другие вопросы по тегам