通过`np.tensortdot`或仅2-D获取`np.dot`的ND行为`np.dot`

时间:2018-10-22 09:04:23

标签: numpy matrix-multiplication

我正尝试仅使用 2-D np.dotnp.dot来表达np.tensordot的N-D行为。

回顾一下,np.dot对N-D进行以下操作:它匹配/广播除最后两个维度以外的所有维度的数组,并对所有维度执行点积。例如,如果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]是{{1} }。

此外,如果np.dot(x[i, j], y[i, j])仅是x.shape,它将首先通过(4, 5)转换为(2, 3, 5, 4)

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

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

1 个答案:

答案 0 :(得分:1)

您发现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,再加上y的形状减去其5。实际上,所有事物的外部产物的大小均为5尺寸。

tensordot使用np.dot。它只是对输入进行整形和转置以将问题减少到2d 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开始-以2d结尾,所以我不明白您的问题。如果您有多个稀疏矩阵,则必须单独使用它们。