np.dot 两个二维数组

np.dot of two 2D arrays

我是 numpy 的新手,很抱歉,如果这听起来很明显,我确实在 post 这之前尝试搜索 Whosebug..

我有两个长度为 n 的“列表列表”numpy 数组(下例中 n = 3)

a = np.array([[1, 2], [3, 4], [5, 6]])
b = np.array([[2, 2], [3, 3], [4, 4]])

我想得到一个一维数组,其中包含列表在每个相应索引处的点积,即

[(1*2 + 2*2), (3*3 + 4*3), (5*4 + 6*4)]
[6, 21, 44]

我应该怎么做?提前致谢!

你可以做到

np.sum(a*b,axis=1)

另一个答案中的sum方法是最直接的方法:

In [19]: a = np.array([[1, 2], [3, 4], [5, 6]])
    ...: b = np.array([[2, 2], [3, 3], [4, 4]])
In [20]: a*b
Out[20]: 
array([[ 2,  4],
       [ 9, 12],
       [20, 24]])
In [21]: _.sum(1)
Out[21]: array([ 6, 21, 44])

有了 dot,我们的想法有点跳出框框。 einsum 是使用不太明显的维度组合指定 dot 类似操作的最简单方法:

In [22]: np.einsum('ij,ij->i',a,b)
Out[22]: array([ 6, 21, 44])

请注意,i 维度是通过的。 dotij,jk->ik,这需要提取对角线(丢弃额外项)。用 matmul/@ 术语来说,i 维度是一个 'batch' 维度,它实际上并不参与积和。要使用它:

In [23]: a[:,None,:]@b[:,:,None]
Out[23]: 
array([[[ 6]],

       [[21]],

       [[44]]])

然后删除多余的尺寸 1 尺寸:

In [24]: _.squeeze()
Out[24]: array([ 6, 21, 44])

einsum 术语中,这是 i1j,ij1->i11