Вы можете избежать временного (3,5,5) использования add.at
и as_strided
:
>>> out = np.zeros((5, 5))
>>> oas = np.lib.stride_tricks.as_strided(out, (3,3,3,3), 2*out.strides)
>>> at = [0,2,1], [0,2,0]
>>> np.add.at(oas, at, (mat1, mat2, mat3))
>>> out
array([[ 0., 1., 2., 0., 0.],
[ 4., 7., 10., 0., 0.],
[13., 16., 21., 3., 4.],
[13., 15., 22., 6., 7.],
[ 0., 0., 8., 9., 10.]])