Вы ошиблись в поведении 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 для начала - и до конца, я не понимаю вашего вопроса.Если у вас есть несколько разреженных матриц, вам придется работать с ними по отдельности.