Самый эффективный способ сделать максимальный результат матрицы из других матриц в NumPy? - PullRequest
0 голосов
/ 27 декабря 2018

Я делаю некоторую обработку сигналов изображения в python, и я все еще плохо знаком с функциями numpy и как это сделать наилучшим образом.

Сценарий: у меня есть четыре матрицы g1, g2, g3, g4 все они имеют одинаковую форму W, H.

Мне нужно сделать матрицу результатов max_g, где каждый max_g [i, j] = max (gk [i, j])

Я зацикливал все изображение и делал:

max_g = np.zeros(Y_channel.shape)
grads = np.array([np.abs(signal.fftconvolve(Y_channel, g_filter, mode='same')/16.0) for g_filter in g_filters])

for i in range(W):
    for j in range(H):
        max_g[i, j] = np.max([grad[i, j] for grad in grads])

Это нормально для изображений 512x512, но это слишком медленно для больших изображений, таких как 1280x720, есть ли более эффективный способ сделать это?Я имею в виду лучше, чем 0 (ШхВ)

1 Ответ

0 голосов
/ 28 декабря 2018

У вас есть список, содержащий ваши массивы, просто stack их и возьмите максимум вдоль первой оси.

Настройка

np.random.seed(1)
H = 5
W = 5
grads = [np.random.randint(1, 10, (W, H)) for _ in range(4)]

stack + max

np.stack(grads).max(0)

array([[6, 9, 9, 6, 9],
       [9, 8, 9, 8, 8],
       [8, 8, 9, 4, 8],
       [9, 8, 9, 8, 5],
       [7, 9, 9, 9, 7]])

Проверка

max_g = np.empty((W, H))
for i in range(W):
    for j in range(H):
        max_g[i, j] = np.max([grad[i, j] for grad in grads])

np.array_equal(max_g, np.stack(grads).max(0))

True

Сроки

H = 720
W = 1280
grads = [np.random.randint(1, 10, (W, H)) for _ in range(4)]

%timeit np.stack(grads).max(0)
14.8 ms ± 190 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%%timeit
max_g = np.empty((W, H))
for i in range(W):
   for j in range(H):
       max_g[i, j] = np.max([grad[i, j] for grad in grads])

10.2 s ± 98.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Как видите, довольно быстрое ускорение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...