我有两个矩阵A,B
,我想创建一个三维数组C
,这样
C[k,i,j]=A[k,j]*B[k,i]
我曾想过使用np.einsum
,但找不到方法,我不确定它在这里是否有用.
一个天真的循环是可能的,但听起来相当低效.
UPDATE
C=np.einsum('kj,ki->kij',A,B)
works,非常优雅,这是在@Warren Weckesser的答案之上
我有两个矩阵A,B
,我想创建一个三维数组C
,这样
C[k,i,j]=A[k,j]*B[k,i]
我曾想过使用np.einsum
,但找不到方法,我不确定它在这里是否有用.
一个天真的循环是可能的,但听起来相当低效.
UPDATE
C=np.einsum('kj,ki->kij',A,B)
works,非常优雅,这是在@Warren Weckesser的答案之上
基本broadcasting将起作用,例如.
In [55]: A # shape is (2, 3)
Out[55]:
array([[4, 9, 5],
[2, 0, 9]])
In [56]: B # shape is (2, 4)
Out[56]:
array([[8, 8, 0, 3],
[6, 8, 3, 8]])
A[:,None,:]
具有形状(2,1,3),B[:,:,None]
具有形状(2,4,1).通过广播,这些表达式的乘积将具有形状(2、4、3).
In [57]: C = A[:,None,:] * B[:,:,None]
In [58]: C
Out[58]:
array([[[32, 72, 40],
[32, 72, 40],
[ 0, 0, 0],
[12, 27, 15]],
[[12, 0, 54],
[16, 0, 72],
[ 6, 0, 27],
[16, 0, 72]]])
In [59]: C.shape
Out[59]: (2, 4, 3)