Как умножить вектор столбца и вектор строки из двух матриц без цикла?

avatar
Nick Nick Nick
9 августа 2021 в 03:17
159
1
0

У меня вопрос о том, как умножить вектор-столбец в матрице A на вектор-строку в его транспонировании A.T. Не могли бы вы дать мне несколько советов? Спасибо!

  • Предположим, что у нас есть матрица (3x3) A следующим образом.
  • Мы хотим умножить вектор column в A на вектор row в A.T (например, красный). Результатом является (3x3) матрица.
  • Хотя у нас есть 3 вектора-строки, окончательная выходная форма должна быть (3x3x3).

Вопрос: Могу ли я спросить, можем ли мы каким-либо образом использовать матричные манипуляции для достижения этой цели? Потому что, если мы просто используем A @ A.T, результат будет (3x3) но не (3x3x3).

(Мы можем решить ее, перебирая каждый столбец A. Но можем ли мы решить ее без цикла for? Спасибо!)

enter image description here

# here is my solution with for-loop

import numpy as np

A = np.array([[1,0,1],[2,10,0],[0,0,10]])

target = []
for i in range(A.shape[0]):
    
    a = A[:,i].reshape(A.shape[0],1)
    tem = a@a.T
    target.append(tem)

print(np.array(target).shape)
Источник
hpaulj
9 августа 2021 в 03:34
1

@ работает, если i, пакетное измерение является первым из 3. Прочтите документы matmul. einsum также обладает большой выразительной силой.

hpaulj
9 августа 2021 в 04:11
0

Вам может понадобиться swapaxes или transpose, а не reshape

Nick Nick Nick
9 августа 2021 в 04:15
0

Привет @hpaulj, я разобрался с твоей инструкцией! Мне просто нужно изменить форму с помощью B1 = A.reshape(3,3,1) и B2 = A.reshape(3,1,3) . Тогда (B1@B2) — это то, что мне нужно. Большое вам спасибо за вашу помощь!

Ответы (1)

avatar
Nick Nick Nick
9 августа 2021 в 04:22
0

Я разобрался с этим вопросом. Нам просто нужны следующие два простых шага:

  • Измените форму матрицы, чтобы получить еще одну ось для вещания:

    • B1 = A.reshape(3,3,1)

    • B2 = A.reshape(3,1,3)

  • Затем используйте точечный/взаимный продукт.

    • B1@B2 — это то, что нам нужно.

(Огромный респект @hpaulj за его предложения! Спасибо)