矢量化numpy赋值

Kev*_*vin 2 python arrays numpy

我通过查找其他numpy数组中的值为numpy数组赋值.这些数组可能有不同的索引.这是一个例子:

import numpy as np
A=1; B=2; C=3; D=4; E=5
X = np.random.normal(0,1,(A,B,C,E))
Y = np.random.normal(0,1,(A,B,D))
Z = np.random.normal(0,1,(A,C))
Result = np.zeros((A,B,C,D,E))
for a in range(A):
    for b in range(B):
        for c in range(C):
            for d in range(D):
                for e in range(E):
                    Result[a,b,c,d,e] = Z[a,c] + Y[a,b,d] + X[a,b,c,e]
Run Code Online (Sandbox Code Playgroud)

优化此代码的最佳方法是什么?我可以使用Result [a,b,c,d,:] = Z [a,c] + Y [a,b,d] + X [a,b,c,:]删除E for循环.但那么如何删除其余的循环?我还在考虑在分配之前可以操作X,Y,Z,因此它可以轻松地与Result的尺寸合并.必须有更优雅的方式.谢谢你的提示.

per*_*iae 6

这是一种方式:

Result = Z[:,None,:,None,None] + Y[:,:,None,:,None] + X[:,:,:,None,:]
Run Code Online (Sandbox Code Playgroud)

为了产生这种量化的版本,我所做的只是更换不同的指数纳入X,Y以及Za,b,c,d,e式的索引,将None在那里被发现失踪指数.例如,Y[a,b,d]变成Y[a,b,None,d,None],矢量化为Y[:,:,None,:,None].

在numpy中,索引通过None告诉数组假装它有一个额外的轴.这不会改变数组的大小,但它确实改变了操作的广播方式,这就是我们需要的.查看numpy广播文档了解更多信息.