numpy数组堆栈与自身的Hermitian转置相乘而没有循环

时间:2018-09-06 01:00:22

标签: numpy vectorization

我想完全摆脱代码中的for循环。

我有一个维数为OxMxN的复数个numpy数组 stack1 。这是一维MxN数组的堆栈,它们沿第一维堆积。对于我们称为 A 的每个MxN数组,我要计算矩阵乘法:

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 :(得分:3)

我们可以使用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)

答案 1 :(得分:0)

只需尝试纠正您的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.]]])