Numpy: Умножение матрицы на 3D-тензор - Предложение - PullRequest
13 голосов
/ 20 декабря 2010

У меня есть матрица P с формой MxN и 3D-тензор T с формой KxNxR. Я хочу умножить P с каждой NxR матрицей на T, в результате чего получается KxMxR 3d-тензор.

P.dot(T).transpose(1,0,2) дает желаемый результат. Есть ли более приятное решение (то есть избавление от transpose) этой проблемы? Это должно быть довольно распространенной операцией, поэтому я предполагаю, что другие нашли другие подходы, например, используя tensordot (что я пытался, но не смог получить желаемый результат). Мнения / мнения будут высоко оценены!

Ответы [ 2 ]

6 голосов
/ 20 декабря 2010
scipy.tensordot(P, T, axes=[1,1]).swapaxes(0,1)
2 голосов
/ 24 ноября 2016

Вы также можете использовать обозначение Эйнштейна для суммирования:

P = numpy.random.randint(1,10,(5,3))
P.shape
T = numpy.random.randint(1,10,(2,3,4))
T.shape

numpy.einsum('ij,kjl->kil',P,T)

, который должен дать вам те же результаты, что и:

P.dot(T).transpose(1,0,2)
...