Numpy Dot两个2-d阵列的产品,在numpy中获得3-d阵列

时间:2016-02-14 21:13:29

标签: python numpy linear dot-product

对于解释不清的标题感到抱歉。我试图并行化我的代码的一部分,并陷入一个点产品。我正在寻找一种有效的方法来执行下面的代码,我确信有一个简单的线性代数解决方案,但我很困惑:

puy = np.arange(8).reshape(2,4)
puy2 = np.arange(12).reshape(3,4)

print puy, '\n'
print puy2.T

zz = np.zeros([4,2,3])

for i in range(4):
    zz[i,:,:] = np.dot(np.array([puy[:,i]]).T,
                np.array([puy2.T[i,:]]))

2 个答案:

答案 0 :(得分:6)

一种方法是使用np.einsum,它允许您指定您希望发生在索引上的内容:

>>> np.einsum('ik,jk->kij', puy, puy2)
array([[[ 0,  0,  0],
        [ 0, 16, 32]],

       [[ 1,  5,  9],
        [ 5, 25, 45]],

       [[ 4, 12, 20],
        [12, 36, 60]],

       [[ 9, 21, 33],
        [21, 49, 77]]])
>>> np.allclose(np.einsum('ik,jk->kij', puy, puy2), zz)
True

答案 1 :(得分:3)

这是broadcasting -

的另一种方式
(puy[None,...]*puy2[:,None,:]).T