Хорошее введение в einsum здесь http://ajcr.net/Basic-guide-to-einsum.
Индексация для вашего случая:
np.einsum('ik,jk->ijk', x.T, M)
Ниже простой тест:
m, n = 3, 2
x = np.arange(n*m).reshape((m, n))
M = np.arange(m*m).reshape((m,m))
x
array([[0, 1],
[2, 3],
[4, 5]])
M
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
y = np.array([xi*M for xi in x.T])
y
array([[[ 0, 2, 8],
[ 0, 8, 20],
[ 0, 14, 32]],
[[ 0, 3, 10],
[ 3, 12, 25],
[ 6, 21, 40]]])
np.einsum('ik,jk->ijk', x.T, M)
array([[[ 0, 2, 8],
[ 0, 8, 20],
[ 0, 14, 32]],
[[ 0, 3, 10],
[ 3, 12, 25],
[ 6, 21, 40]]])