Изменить каждый элемент матрицы без использования цикла
Задача такая:
Пусть есть матрица A с элементами a[i, j], где 0 <= i <= n - 1, 0 <= j <= m - 1. Пусть h, w - некоторые натуральные числа.
Как я могу получить средствами numpy (без использования циклов!!) матрицу C такого же размера, в который каждый элемент
c[i, j] = a[i, j] + a[i, j-1] + a[i, j-2] + ... + a[i, j-w] +
+ a[i-1, j] + a[i-1, j-1] + a[i-1, j-2] + ... + a[i-1, j-w] +
+ ... +
+ a[i-h, j] + a[i-h, j-1] + a[i-h, j-2] + ... + a[i-h, j-w]
Причём, когда i или j выходят за размеры изначальной матрицы, то будем считать a[i, j] = 0
Другими словами, вроде
c[i, j] = a[i-h:i+1, j-w:j+1].sum()
Всем спасибо
UPD:
Пример
Пусть h = 1, w = 2
a = [[ 1 9 -3 6]
[ 2 -8 0 5]
[ 0 0 10 6]
[-2 6 0 -1]]
Теперь найдём матрицу c. Например,
c[2, 3] = a[2, 3] + a[2, 3-1] + a[2, 3-2] +
+ a[2-1, 3] + a[2-1, 3-1] + a[2-1, 3-2] =
= a[2, 3] + a[2, 2] + a[2, 1] +
+ a[1, 3] + a[1, 2] + a[1, 1] =
= 6 + 10 + 0 +
+ 5 + 0 + (-8) = 13
И так далее
C = [[ 1 10 7 12]
[ 3 4 1 9]
[ 2 -6 4 13]
[-2 4 14 21]]