2015-05-01 112 views
3

我有以下两个数组与形状:矩阵乘法与numpy.einsum

A = (d,w,l) 
    B = (d,q) 

而且我想用这些形状组合成一个3D阵列:

C = (q,w,l) 

要多一点具体来说,在我的情况下,d(3D阵列的深度)是2,并且我首先想要在A的上层(因此d = 0)中将w * 1中的所有位置乘以B的第一个值最高行(所以d = 0,q = 0)。对于d = 1 I做的一样,再总结两个这样:

C_{q=0,w,l} = A_{d=0,w,l}*B_{d=0,q=0} + A_{d=1,w,l}*B_{d=1,q=0} 

我想通过利用numpy.einsum来计算℃。我想到了以下代码:

A = np.arange(100).reshape(2,10,5) 

    B = np.arange(18).reshape(2,9) 

    C = np.einsum('ijk,i -> mjk',A,B) 

其中ijk指2,10,5,mjk指9,10,5。但是我得到一个错误。有没有办法用numpy einsum来执行这种乘法?

感谢

+2

快速的问题:你是从你的标串缺少'M' 。它应该是'np.einsum('ijk,im - > mjk',A,B)'?这会创建一个新的数组 - 这是你在找什么? –

+0

感谢您的回答,但如果我这样做,我会得到以下错误: 操作数无法与重新映射的形状一起广播[原始 - >重新映射]:(2,10,5) - >(10,5,2) (9,2) - >(2,newaxis,newaxis,9) –

+2

当我运行你的'我想到下面的代码',但改变''ijk,我 - > mjk''为''ijk,im - > mjk''(如@ajcr建议)我没有收到错误。 – farenorth

回答

4

你的形状A = (d,w,l), B = (d,q), C = (q,w,l)实际上写einsum表达

C=np.einsum('dwl,dq->qwl',A,B) 

,我可以测试

In [457]: np.allclose(A[0,:,:]*B[0,0]+A[1,:,:]*B[1,0],C[0,:,:]) 
Out[457]: True