Умножение / сложение на элемент с массивами - PullRequest
2 голосов
/ 25 марта 2019

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

Есть изображение, и мне нужно пересчитать только ненулевые пиксели. И я хочу сделать это через 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?

Ответы [ 3 ]

3 голосов
/ 25 марта 2019

Вы можете использовать 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 голос
/ 25 марта 2019

Другой способ будет:

matrix = matrix * 2.0 + 0.5 * (matrix!=0)
0 голосов
/ 30 марта 2019

Возможно, вам будет интересно узнать другой способ использования 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. ]])
...