Numpy 使用'np.tensortdot'或仅二维'np.dot'获取'np.dot'的ND行为`

Numpy 使用'np.tensortdot'或仅二维'np.dot'获取'np.dot'的ND行为`,numpy,matrix-multiplication,Numpy,Matrix Multiplication,我试图用二维的np.dot或np.tensordot来表达np.dot的N-D行为 总而言之,np.dot对N-D做了如下操作:它沿所有维度匹配/广播数组,但最后两个维度除外,并对所有维度执行点积。例如,如果x.shape是2,3,4,5,y.shape是2,3,5,4,np.dotx,y.shape是2,3,4,4,np.dotx,y[i,j]是np.dotx[i,j],y[i,j] 此外,如果x.shape仅为4,5,它将首先通过np.broadcast转换为2,3,5,4 我尝试了np.t

我试图用二维的np.dot或np.tensordot来表达np.dot的N-D行为

总而言之,np.dot对N-D做了如下操作:它沿所有维度匹配/广播数组,但最后两个维度除外,并对所有维度执行点积。例如,如果x.shape是2,3,4,5,y.shape是2,3,5,4,np.dotx,y.shape是2,3,4,4,np.dotx,y[i,j]是np.dotx[i,j],y[i,j]

此外,如果x.shape仅为4,5,它将首先通过np.broadcast转换为2,3,5,4

我尝试了np.tensortdotx,y,axes=-1,-2,但它沿着x,y的每个维度重复,而不是匹配它们


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

你把np.dot的广播行为搞错了:

对于4,5 x:

添加matmul正是因为np.dot的行为不像是对所有i,j执行np.dotx[i,j,:,:],y[i,j,:,:,:]

输入输出[255]的形状是x减去5的形状,加上y减去5的形状。实际上是所有东西的外部产物,大小为5维

tensordot使用np.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]

因为稀疏矩阵是二维的,所以我不理解你的问题。如果你有多个稀疏矩阵,你就必须单独使用它们。

我认为你应该使用matmul:np.matmula,b或a@b.@Divakar来工作,但我非常想用scipy.sparse.csr_matrix.dot来完成,它只有2d稀疏矩阵是2d,period。这不仅仅是他们的小点。
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)
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]