У вас есть список, содержащий ваши массивы, просто 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)
Как видите, довольно быстрое ускорение.