用无环厄米转置乘numpy数组堆栈
我想在代码中完全去掉for循环 我有一个复杂的numpy数组stack1的维度OxMxN这是一个堆叠在第一维度的MxN数组堆栈。对于我们称为A的每个MxN数组,我要计算矩阵乘法:用无环厄米转置乘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 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)