Умножение набора пустых массивов с помощью эрмитовой транспонирования без цикла - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу полностью избавиться от циклов for в моем коде.

У меня есть сложный массив NumPy stack1 измерения OxMxN Это стек массивов MxN, собранных в 1-м измерении. Для каждого массива MxN, который мы называем A , я хочу вычислить умножение матриц:

for k in range(stack1.shape[0]):
    A=stack1[k,:,:]
    newstack[k,:,:]=A.dot(  numpy.conj(numpy.transpose(A))  )

Я пытался

newstack = stack1 @ np.conj(stack1.T)

но я столкнулся с проблемой, потому что размеры не будут совпадать

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Мы можем использовать einsum -

np.einsum('ijk,ilk->ijl',stack1,np.conj(stack1))

Мы также можем использовать np.matmul -

np.matmul(stack1,np.conj(stack1).swapaxes(1,2))

Вкл. Python 3.x, упрощается с помощью оператора @ -

stack1 @ np.conj(stack1).swapaxes(1,2)
0 голосов
/ 06 сентября 2018

Просто попробуйте исправить цикл for

a=[]
for k in range(stack1.shape[0]):
    A=stack1[k,:,:]
    a.append(A.dot(  numpy.conj(numpy.transpose(A))  ))

np.array(a)
Out[399]: 
array([[[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],
       [[0., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...