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