如何获得点积但没有求和

时间:2016-08-16 17:38:30

标签: python numpy

考虑数组' ab

a = np.array([
        [-1, 1, 5],
        [-2, 3, 0]
    ])
b = np.array([
        [1, 1, 0],
        [0, 2, 3],
    ])

看着

d = a.T.dot(b)
d

array([[-1, -5, -6],
       [ 1,  7,  9],
       [ 5,  5,  0]])

d[0, 0]-1。并且是a[:, 0] * b[:, 0]的总和。我想要一个2x2向量数组,其中[0, 0]位置为a[:, 0] * b[:, 0]

使用上述ab,我希望

d = np.array([[a[:, i] * b[:, j] for j in range(a.shape[1])] for i in range(b.shape[1])])

d

array([[[-1,  0],
        [-1, -4],
        [ 0, -6]],

       [[ 1,  0],
        [ 1,  6],
        [ 0,  9]],

       [[ 5,  0],
        [ 5,  0],
        [ 0,  0]]])

d沿axis==2的总和应为点积a.T.dot(b)

d.sum(2)

array([[-1, -5, -6],
       [ 1,  7,  9],
       [ 5,  5,  0]])

问题

获得d的最有效方式是什么?

3 个答案:

答案 0 :(得分:6)

这是一种方式:

In [219]: a
Out[219]: 
array([[-1,  1,  5],
       [-2,  3,  0]])

In [220]: b
Out[220]: 
array([[1, 1, 0],
       [0, 2, 3]])

In [221]: a.T[:,None,:] * b.T[None,:,:]
Out[221]: 
array([[[-1,  0],
        [-1, -4],
        [ 0, -6]],

       [[ 1,  0],
        [ 1,  6],
        [ 0,  9]],

       [[ 5,  0],
        [ 5,  0],
        [ 0,  0]]])

或者...

In [231]: (a[:,None,:] * b[:,:,None]).T
Out[231]: 
array([[[-1,  0],
        [-1, -4],
        [ 0, -6]],

       [[ 1,  0],
        [ 1,  6],
        [ 0,  9]],

       [[ 5,  0],
        [ 5,  0],
        [ 0,  0]]])

答案 1 :(得分:2)

效率最高的是broadcasting,如@Warren Weckesser's post所示,因为我们基本上处理的是元素乘法而没有任何sum-reduction

另一个np.einsum就是这样 -

np.einsum('ij,ik->jki',a,b)

答案 2 :(得分:0)

for r in a.T:
    print(np.multiply(r,b.T))

[[-1  0]
 [-1 -4]
 [ 0 -6]]
[[1 0]
 [1 6]
 [0 9]]
[[5 0]
 [5 0]
 [0 0]]