Попробуйте использовать широковещание и умножение:
image * image_mask[..., None]
Я предполагаю, что типом image_mask является bool, который отображается на числа 0 и 1. Поэтому при парном умножении изображения и маски установит маскированные значения на ноль.
Подобный эффект может быть достигнут с помощью np.where () или & operator.
Проблема в том, что формы image и image_mask несовместимы. Numpy сначала добавит дополнительные размеры в начало фигуры, пока оба тензора не будут иметь одинаковую форму. Таким образом, image_mask преобразуется из (188, 212) в (1,188, 212). Эта новая форма не совместима с формой изображения (188, 212, 3).
Хитрость заключается в том, чтобы изменить форму image_mask с помощью необычной индексации. Вы можете использовать None в качестве индекса, чтобы добавить фиктивное измерение размера 1 в конце фигуры. Операция image_mask [..., None] изменит ее с (188, 212) на (188, 212,1).
Правила вещания говорят о том, что измерения размера 1 расширяются путем повторения всех значений по измерению вещания. ,Таким образом, numoy автоматически изменит тензир с (188, 212,1) на (188, 212,3). Операция выполняется очень быстро, потому что копия не создается.
Теперь можно умножить тизеры, чтобы получить желаемый результат.