首页 > 解决方案 > 使用 `np.tensordot` 或仅二维 `np.dot` 获取 `np.dot` 的 ND 行为

问题描述

我试图表达np.dot使用2-D或.np.dotnp.tensordot

回顾一下,np.dot对 ND 执行以下操作:它沿除最后两个维度之外的所有维度匹配/广播数组,并对所有维度执行点积。例如,如果x.shape(2, 3, 4, 5)y.shape(2, 3, 5, 4)np.dot(x, y).shape(2, 3, 4, 4)np.dot(x, y)[i, j]np.dot(x[i, j], y[i, j])

此外,如果x.shapeis just (4, 5),它将首先转换为(2, 3, 5, 4)via np.broadcast

我试过np.tensortdot(x, y, axes=(-1, -2))了,但它沿着 的每个维度重复xy而不是匹配它们。

我意识到我可以写一个循环,但我正在寻找一个矢量化的解决方案。

标签: numpymatrix-multiplication

解决方案


你得到了np.dot错误的广播行为:

In [254]: x=np.ones((2,3,4,5)); y=np.ones((2,3,5,4))
In [255]: np.dot(x,y).shape
Out[255]: (2, 3, 4, 2, 3, 4)
In [256]: np.matmul(x,y).shape
Out[256]: (2, 3, 4, 4)

对于 (4,5) x

In [257]: np.dot(x[0,0],y).shape
Out[257]: (4, 2, 3, 4)
In [258]: np.matmul(x[0,0],y).shape
Out[258]: (2, 3, 4, 4)

matmul之所以添加,正是因为np.dot它不像np.dot(x[i,j,:,:], y[i,j,:,:])为所有人表演i,j

中的形状Out[255]x减 5 的形状,加上减 5 的形状。y实际上是所有东西的外部产物,总和在大小 5 维度上。

tensordot使用np.dot. 它只是重塑和转置输入以将问题简化为二维问题dot。然后它将结果按摩回所需的形状和顺序。

In [259]: np.tensordot(x, y, axes=(-1,-2)).shape
Out[259]: (2, 3, 4, 2, 3, 4)   # cf Out[255]

In [261]: np.einsum('ijkl,ijlm->ijkm',x,y).shape
Out[261]: (2, 3, 4, 4)    # cf Out[256]

由于稀疏矩阵是 2d 开始 - 和结束,我不明白你的问题。如果您有多个稀疏矩阵,则必须单独使用它们。


推荐阅读