Если ваш вопрос ограничен вычислением среднего значения, вам необязательно вводить подмножество изображения. Вы можете просто сделать, например,
np.sum(colormaskcutted*boolean[:,:,None], axis = (0,1))/np.sum(boolean)
PS Я поиграл с индексированием, вы можете изменить свой первоначальный подход следующим образом:
np.mean(colormaskcutted[boolean,:], axis = 0)
PPS Не могу устоять перед некоторым сравнительным тестированием. Итак, подход суммирования занимает 15.9s
(1000 итераций, измерения, как в примере, старый компьютер); продвинутый подход индексации немного длиннее, на 17.7s
. Однако суммирование может быть дополнительно оптимизировано. Использование count_nonzero
согласно предложению Безумного Физика незначительно увеличивает время до 15.3s
. Мы также можем использовать tensordot
, чтобы пропустить создание временного массива:
np.tensordot(colormaskcutted, boolean, axes = [[0,1], [0,1]])/np.count_nonzero(msk)
Это сократит время до 4.5s
.