#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. ]])