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
维度是通过的。 dot
做 ij,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
我是 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
维度是通过的。 dot
做 ij,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