数组和向量的numpy元素乘法

bob*_*nto 7 python arrays numpy

我想做这样的事情:

a =  # multi-dimensional numpy array
ares = # multi-dim array, same shape as a
a.shape
>>> (45, 72, 37, 24)  # the relevant point is that all dimension are different
v = # 1D numpy array, i.e. a vector
v.shape
>>> (37)  # note that v has the same length as the 3rd dimension of a
for i in range(37):
    ares[:,:,i,:] = a[:,:,i,:]*v[i]
Run Code Online (Sandbox Code Playgroud)

我认为必须有一个更紧凑的方式来做这个numpy,但我还没弄明白.我想我可以复制v然后计算a*v,但我猜测还有更好的东西.所以我需要"在一个给定的轴上"进行元素智能乘法,可以这么说.谁知道我怎么做到这一点?谢谢.(顺便说一下,我确实发现了一个非常复杂的问题,但由于OP在那里的特殊问题的性质,讨论非常简短,并被追踪到其他问题.)

aba*_*ert 5

您可以针对数组的最外层轴自动广播向量。因此,您可以转置数组以将您想要的轴交换到外部,相乘,然后将其转回:

ares = (a.transpose(0,1,3,2) * v).transpose(0,1,3,2)
Run Code Online (Sandbox Code Playgroud)


bog*_*ron 5

您可以使用numpy einsum函数使用爱因斯坦求和符号来执行此操作:

ares = np.einsum('ijkl,k->ijkl', a, v)
Run Code Online (Sandbox Code Playgroud)


Bi *_*ico 5

这里还有一个:

b = a * v.reshape(-1, 1)
Run Code Online (Sandbox Code Playgroud)

恕我直言,这比transposeeinsum甚至可能更易读v[:, None],但请选择适合您的风格。