Умножьте каждую строку матрицы на сопряженную транспонированную numpy

У меня есть переменная numpy.ndarray A размера MxN. Я хочу взять каждую строку и умножить ее на сопряженное транспонирование. Для первой строки получим:

np.matmul(np.expand_dims(A[0,:],axis=1),np.expand_dims(A[0,:].conj(),axis=0))

мы получаем результат размера NxN. Я хочу, чтобы окончательный результат всей операции имел размер MxNxN.

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

В противном случае, могу ли я сделать что-то еще и как-то переформировать результаты в свое требование?


person havakok    schedule 15.08.2019    source источник


Ответы (2)


Следующий код делает то же самое, что и ваш фрагмент кода, но без цикла for. С другой стороны, он использует np.repeat дважды, поэтому вам нужно будет протестировать обе версии и сравнить их, чтобы проверить их производительность памяти/времени.

import numpy as np

m, n = A.shape

x, y = A.conj().repeat(n, axis=0), A.reshape([-1, 1]).repeat(n, axis=1)
B = (x * y).reshape([m, n, n])

Как это работает

В основном x содержит сопряженные значения массива A в одном столбце, а затем повторяется n раз по оси столбца (он имеет форму m*n by n).

y повторяет каждую строку в сопряженной матрице A, n раз подряд (его окончательная форма также m*n by n)

x и y умножаются поэлементно, и результат разворачивается в матрицу формы m by n by n, хранящуюся в B.

person Victor Ruiz    schedule 15.08.2019

Понимание списка может помочь:

result = np.array([np.matmul(np.expand_dims(A[i,:],axis=1), np.expand_dims(A[i,:].conj(),axis=0)) for i in range(A.shape[0])])
person bexi    schedule 15.08.2019