Numpy точечный продукт для группы строк - PullRequest
1 голос
/ 29 января 2020

Я пытаюсь вычислить скалярное произведение между двумя матрицами для каждой пары строк. У меня есть матрица D с (u x 2) размерами и матрица R с (u*2 x c) размерами. Ниже приведен пример:

D = np.array([[0.02747092, 0.11233295],
              [0.02747092, 0.07295284],
              [0.01245856, 0.19935923],
              [0.01245856, 0.13520913],
              [0.11233295, 0.07295284]])

R = np.array([[-3.        ,  0.        ,  1.        , -1.        ],
              [-1.25      ,  0.75      ,  1.75      , -1.25      ],
              [-2.33333333, -0.33333333,  1.66666667, -1.33333333],
              [-1.25      ,  0.75      ,  1.75      , -1.25      ],
              [ 0.        , -2.        ,  2.        , -4.        ],
              [-1.25      ,  0.75      ,  1.75      , -1.25      ],
              [ 0.66666667, -3.33333333,  2.66666667, -4.33333333],
              [-1.25      ,  0.75      ,  1.75      , -1.25      ],
              [-2.33333333, -0.33333333,  1.66666667, -1.33333333],
              [-3.        ,  0.        ,  1.        , -1.        ]])

Результатом должна быть матрица M с размерами (u x c), как показано ниже (пример первой строки):

M = np.array([[-0.2185,  0.0825,  0.2195, -0.1645],
              [...]])

Что является результатом dot product между первой строкой D и первыми двумя строками матрицы R как таковой:

D_ = np.array([[0.027, 0.11]])
R_ = np.array([[-3.,  0.,  1., -1.],
               [-1.25, 0.75, 1.75, -1.25]])

D_.dot(R_)

Я пробовал различные способы np.tensordot после преобразования матрицы D в тензор, но без каких-либо удачи. Я ищу векторизованное решение и избегаю петель (что является моим текущим решением, довольно медленным).

1 Ответ

1 голос
/ 29 января 2020

Измените R в 3D и используйте np.einsum -

np.einsum('ijk,ij->ik',R.reshape(len(D),2,-1),D)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...