Точка продукта столбцы по строкам Python - Numpy - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь вычесть скалярное произведение каждой строки против себя в векторе nx3.Позвольте мне объяснить немного лучше: мне нужно перейти от nx3 к массиву nx3x3.

Если у меня есть следующее:

A = np.array([[1, 2, 2],
              [4, 2, 3])

Я хотел бы получить то, что было быбыть:

Первый элемент:

np.dot(A[0].reshape(3,1), A[0].reshape(1,3)) = array([[1, 2, 2], [2, 4, 4], [2, 4, 4]])

Второй элемент:

np.dot(A[1].reshape(3,1), A[1].reshape(1,3)) = array([[16, 8, 12], [8, 4, 6], [12, 6, 9]])

Итак, мой окончательный массив будет:

result = array([[[ 1, 2,  2], 
                 [ 2, 4,  4], 
                 [ 2, 4,  4]],
                [[16, 8, 12], 
                 [ 8, 4,  6], 
                 [12, 6,  9]])

result.shape = (2, 3, 3)

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

Надеюсь, я объяснил себя достаточно правильно.Заранее спасибо.

1 Ответ

0 голосов
/ 29 января 2019
In [301]: A = np.array([[1, 2, 2],
     ...:               [4, 2, 3]])
     ...: 
     ...: 

Это не dot продукт;нет суммирования продуктов.Скорее это больше похоже на outer продукт, увеличивающий количество измерений.numpy с трансляцией делает это красиво:

In [302]: A[:,:,None]*A[:,None,:]
Out[302]: 
array([[[ 1,  2,  2],
        [ 2,  4,  4],
        [ 2,  4,  4]],

       [[16,  8, 12],
        [ 8,  4,  6],
        [12,  6,  9]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...