Python 在numpy中按矩阵多个矩阵列

Python 在numpy中按矩阵多个矩阵列,python,numpy,matrix-multiplication,Python,Numpy,Matrix Multiplication,我试图以更有效的方式计算此操作: y = np.array([xi*M for xi in x.T]) 其中x是(m,n)矩阵和ma(m,m)矩阵。输出y的形状为(n,m,m),每个y[i,:,:]=np.乘(x[:,i],m) 我曾想过使用einsum,但我很难理解如何使用下标。这里是einsum的精彩介绍 为您的案例编制索引: np.einsum('ik,jk->ijk', x.T, M) 下面是一个简单的测试: m, n = 3, 2 x = np.arange(n*m).res

我试图以更有效的方式计算此操作:

y = np.array([xi*M for xi in x.T])
其中
x
(m,n)
矩阵和
m
a
(m,m)
矩阵。输出
y
的形状为
(n,m,m)
,每个
y[i,:,:]=np.乘(x[:,i],m)


我曾想过使用einsum,但我很难理解如何使用下标。

这里是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]]])

更直接的下标

out = np.einsum('ij,li ->jli',x,M)

Out[187]:
array([[[  0,   3,  12,  27],
        [  0,  15,  36,  63],
        [  0,  27,  60,  99],
        [  0,  39,  84, 135]],

       [[  0,   4,  14,  30],
        [  4,  20,  42,  70],
        [  8,  36,  70, 110],
        [ 12,  52,  98, 150]],

       [[  0,   5,  16,  33],
        [  8,  25,  48,  77],
        [ 16,  45,  80, 121],
        [ 24,  65, 112, 165]]])
不使用einsum(仅基本):


“x可能是n乘m,不是吗?”阿列克谢默编辑,谢谢你指出我的错误,实际上x是(m,n)代表
np。乘法(x[:,i],m)
可以工作。@AndreasK。你是对的,但他确实做了
np.multiply(x[i],M)
# Example
# m, n = 5, 3
# M = np.random.rand(m,m)
# x = np.random.rand(m,n)

y = x.T[:,None] * M