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在那里的特殊问题的性质,讨论非常简短,并被追踪到其他问题.)
您可以针对数组的最外层轴自动广播向量。因此,您可以转置数组以将您想要的轴交换到外部,相乘,然后将其转回:
ares = (a.transpose(0,1,3,2) * v).transpose(0,1,3,2)
Run Code Online (Sandbox Code Playgroud)
您可以使用numpy einsum函数使用爱因斯坦求和符号来执行此操作:
ares = np.einsum('ijkl,k->ijkl', a, v)
Run Code Online (Sandbox Code Playgroud)
这里还有一个:
b = a * v.reshape(-1, 1)
Run Code Online (Sandbox Code Playgroud)
恕我直言,这比transpose,einsum甚至可能更易读v[:, None],但请选择适合您的风格。
| 归档时间: |
|
| 查看次数: |
7473 次 |
| 最近记录: |