Умножение матриц векторов с использованием точечного продукта - PullRequest
2 голосов
/ 25 июня 2019

Мне даны две двумерные матрицы, где каждая из ячеек представляет собой вектор с тремя элементами.

Я хочу использовать умножение двумерной матрицы, когда, когда любая из ячеек умножается вместе, онаберет скалярное произведение трехэлементных векторов.

Моим навыкам линейной алгебры не хватает, поэтому извиняюсь, если уже есть ответ, я просмотрел много страниц, связанных с тензордо и эинсумами, но я не понимаюкак каждый из них может относиться к моей ситуации.

Вот в основном то, что мне дают:

import numpy as np
ar1 = np.array([[[1,2,3],[3,4,5]],[[5,6,7],[7,8,9]]])
ar2 = np.array([[[2,3,4],[4,5,6]],[[6,7,8],[8,9,10]]])

Вот как сделать то, что я ищу:

final = [[0 for x in range(2)] for y in range(2)] 

final[0][0] = np.dot(ar1[0][0], ar2[0][0]) + np.dot(ar1[0][1], ar2[1][0])
final[0][1] = np.dot(ar1[0][0], ar2[0][1]) + np.dot(ar1[0][1], ar2[1][1])
final[1][0] = np.dot(ar1[1][0], ar2[0][0]) + np.dot(ar1[1][1], ar2[1][0])
final[1][1] = np.dot(ar1[1][0], ar2[0][1]) + np.dot(ar1[1][1], ar2[1][1])

final

Output: [[106, 142], [226, 310]]

В действительности эти матрицы собираютсябыть около 3000x40000x3 и 40000x40x3, поэтому очень важно учитывать скорость.Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Вот как это сделать с einsum

np.einsum('ijl,jkl',ar1,ar2)
# array([[106, 142],
#        [226, 310]])

и с tensordot

np.tensordot(ar1,ar2,((1,2),(0,2)))
# array([[106, 142],
#        [226, 310]])

и с изменением формы

ar1.reshape(2,-1)@ar2.transpose(0,2,1).reshape(-1,2)
# array([[106, 142],
#        [226, 310]])
1 голос
/ 25 июня 2019

Матричное произведение двух матриц A и B может быть достигнуто с помощью A@B. Продукт матрицы выполняется только в двух последних измерениях, поэтому вы должны убедиться, что все ранее измеренные размеры одинаковы (или что Python может транслировать). Таким образом, A может иметь форму (10000,2,3,5), а B - (10000,2,5,7), а A@B - иметь форму (10000,2,3,7):

final = np.sum(ar2.T@ar1.T,axis=0).T

должен сделать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...