Вы можете векторизовать его, как показано ниже
arr = np.arange(16).reshape(4,4)
arr2 = np.pad(arr, [(1,0), (1,1)], mode="constant")[:-1, :]
result = arr+arr2[:,0:-2]+arr2[:,1:-1]+arr2[:,2:]
Описание
np.pad(arr, [(1,0), (1,1)], mode="constant")
нули для пэдов слева, справа и сверху матрицы. index [: -1,:] удалит последнюю строку, эффективно сместив матрицу на одну строку arr2[:,0:-2], arr2[:,1:-1], arr2[:,2:]
даст верхний левый, верхний и верхний правый элемент для каждого соответствующего элемента arr
. Если элемента нет, выдается 0 (нули дополняются на предыдущем шаге)
Результат
## arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
## result
array([[ 0, 1, 2, 3],
[ 5, 8, 12, 12],
[17, 24, 28, 24],
[29, 40, 44, 36]])