Вычислить скалярное произведение массива матриц и строк или столбцов другой матрицы. - PullRequest
0 голосов
/ 12 октября 2019

Имея два ndarrays, массив d с формой (3,10,10) и массив e с формой (3,10), как рассчитать скалярное произведение первой матрицы 10x10 из d ипервая строка e, вторая матрица 10x10 d и вторая строка e и т. д.

Например, имеющие следующие два массива:

d = np.array([np.diag([1,1,1,1,1,1,1,1,1,1]), 
              np.diag([2,2,2,2,2,2,2,2,2,2]), 
              np.diag([3,3,3,3,3,3,3,3,3,3])])     
e = np.arange(30).reshape((3,10))

Как рассчитать массив 3x10:

array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [20, 22, 24, 26, 28, 30, 32, 34, 36, 38],
       [60, 63, 66, 69, 72, 75, 78, 81, 84, 87]])

Я пытался использовать np.dot и np.tensordot, а также перед этим сделать транспонирование и добавление новой оси в e, но я не могу понятьузнать, как решить эту проблему.

1 Ответ

2 голосов
/ 12 октября 2019

Мы можем использовать np.einsum -

np.einsum('ijk,ij->ik',d,e)

Поэкспериментируйте с его флагом optimize, чтобы использовать BLAS.

Или np.matmul -

np.matmul(d,e[...,None])[...,0]

Примечание: в Python 3.x np.matmul можно заменить на @ operator.

...