数组与

2024-05-29 08:06:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想这样做:

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]

我想应该有一个更紧凑的方法来处理numpy,但是我还没有弄明白。我想我可以复制v,然后计算a*v,但我想还有更好的方法。所以我需要在给定的轴上做元素乘法。有人知道我怎么做吗?谢谢。(顺便说一句,我确实发现了一个非常相似的问题,但由于OP的特殊问题的性质,讨论时间很短,并被跟踪到其他问题。)


Tags: the方法numpythatasarraymultipoint
3条回答

你可以用爱因斯坦求和记法,用numpy的einsum函数来实现这一点:

ares = np.einsum('ijkl,k->ijkl', a, v)

这里还有一个:

b = a * v.reshape(-1, 1)

嗯,这比transposeeinsum甚至v[:, None]更易读,但是选择一个适合你风格的。

可以automatically broadcast相对于数组最外轴的向量。因此,您可以transpose数组将您想要的轴交换到外部,乘法,然后将其转置回去:

ares = (a.transpose(0,1,3,2) * v).transpose(0,1,3,2)

相关问题 更多 >

    热门问题