我正尝试仅使用 2-D np.dot
或np.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
的每个维度重复,而不是匹配它们。
我意识到我可以编写一个循环,但是我正在寻找向量化解决方案。
答案 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结尾,所以我不明白您的问题。如果您有多个稀疏矩阵,则必须单独使用它们。