用无环厄米转置乘numpy数组堆栈

用无环厄米转置乘numpy数组堆栈,numpy,vectorization,Numpy,Vectorization,我想在代码中完全去掉for循环 我有一个复杂的numpy数组stack1的维度OxMxN这是一个堆叠在第一维度的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)

我想在代码中完全去掉for循环

我有一个复杂的numpy数组stack1的维度OxMxN这是一个堆叠在第一维度的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)

但是我遇到了一个问题,因为维度不匹配,请尝试更正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.]]])
我们可以使用-

我们也可以使用-

python3.x
上,使用
@
运算符进行简化-

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

我想完全避免循环你不想要一个完整的默认转置。你想要一个局部的,将(O,M,N)改为(O,N,M)。认真阅读
matmul
transpose
的文档,如果你在做复杂的场数学,比如提问者显然是,你可能已经知道爱因斯坦求和符号。擅长于
np.einsum
。不仅编写时间更短,而且通常更快(尤其是使用
optimize=True
),您的代码将更容易被您所在领域的其他人解析。
/einsum\u soapbox
np.matmul(stack1,np.conj(stack1).swapaxes(1,2))
stack1 @ np.conj(stack1).swapaxes(1,2)