Получение ND-поведения `np.dot` с` np.tensortdot` или только с двумерным `np.dot` - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь выразить ND поведение np.dot, используя только 2-D np.dot или np.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.shape равно(4, 5), сначала он будет преобразован в (2, 3, 5, 4) через np.broadcast.

Я пытался np.tensortdot(x, y, axes=(-1, -2)), но он повторяется по всем измерениям x, y вместо сопоставления их.

Я понимаю, что могу написать цикл, но я искал векторизованное решение.

1 Ответ

0 голосов
/ 22 октября 2018

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

...