Игра с broadcasting
:
vals[:, None, None, :] * factors.T[None, :, :, None]
Вывод:
array([[[[ 1., 2., 3.],
[ 2., 4., 6.],
[ 3., 6., 9.]],
[[ 4., 8., 12.],
[ 5., 10., 15.],
[ 6., 12., 18.]]],
[[[ 4., 5., 6.],
[ 8., 10., 12.],
[12., 15., 18.]],
[[16., 20., 24.],
[20., 25., 30.],
[24., 30., 36.]]],
[[[ 7., 8., 9.],
[14., 16., 18.],
[21., 24., 27.]],
[[28., 32., 36.],
[35., 40., 45.],
[42., 48., 54.]]]])