Умножение / сложение на элемент с помощью массивов numpy

#python #python-3.x #numpy #slice #numpy-ndarray

#python #python-3.x #numpy #срез #numpy-ndarray

Вопрос:

У меня странная проблема.

Есть изображение, и мне нужно пересчитать только ненулевые пиксели. И я хочу сделать это через numpy , поскольку я обрабатываю тысячи изображений, и мне нужно, чтобы это было быстро.

Вот упрощенный пример с меньшей размерностью.

Допустим, у меня есть следующая матрица:

 [[0,  0,  1],
 [0,  2,  0],
 [0,  6,  0]]
  

и допустим, я хочу умножить каждое значение на 2.0 и добавить 0.5 .

 matrix = matrix * 2.0   0.5
  

Результатом является:

 [[0.5,  0.5,   2.5],
 [0.5,  4.5,   0.5],
 [0.5,  12.5,  0.5]]
  

И я хочу, чтобы это было:

 [[0,  0,   2.5],
 [0,  4.5,   0],
 [0,  12.5,  0]]
  

Очевидно, что я могу просто сделать это в for цикле с if pixel == 0: continue помощью, но это было бы очень медленно. И я не могу избавиться от добавления, оставив только компонент нормализации.

Итак, мне было интересно, можно ли это сделать через numpy ?

Ответ №1:

Вы можете использовать np.where для выбора из x или y в зависимости от указанного условия:

 a = np.array([[0,  0,  1],
              [0,  2,  0],
              [0,  6,  0]])

np.where(a!=0, a*2.   0.5, a)

array([[ 0. ,  0. ,  2.5],
       [ 0. ,  4.5,  0. ],
       [ 0. , 12.5,  0. ]])
  

Комментарии:

1. Отлично, это именно то, что я искал!

2. Не было бы лучше np.where(np.logical_or(a < -e , a > e), a * 2. 0.5, a) где e — число с плавающей запятой, близкое к нулю, обозначающее порог, с которого можно было бы считать значение равным нулю? Или numpy уже учитывает это и, возможно, имеет параметр для его настройки?

Ответ №2:

Другим способом было бы:

 matrix = matrix * 2.0   0.5 * (matrix!=0)
  

Ответ №3:

Возможно, вам будет интересно узнать другой способ использования np.where . Здесь вы проверяете, являются ли значения меньше 1, присваиваете им значение 0

 matrix = matrix*2   0.5
np.where(matrix<1, 0, matrix)
# array([[ 0. ,  0. ,  2.5],
#        [ 0. ,  4.5,  0. ],
#        [ 0. , 12.5,  0. ]])