我有以下代码,其中 w 是兼容维度的 1D numpy 数组,M 是 4D 数组,
i = 0
for weight in w:
M[:, :, i, :] *= weight
i += 1
有没有更好的方法来达到同样的效果?
我有以下代码,其中 w 是兼容维度的 1D numpy 数组,M 是 4D 数组,
i = 0
for weight in w:
M[:, :, i, :] *= weight
i += 1
有没有更好的方法来达到同样的效果?
您正在与来自 的元素M
一起缩放,这是一个数组。因此,您需要使用 扩展为 2D 数组,这将与 之间的轴对齐。然后,在这两个数组之间执行逐元素乘法以引入矢量化解决方案,如下所示 -axis=2
w
1D
w
np.newaxis/None
extended version of w
M
broadcasting
M *= w[:,None]
如果axis=2
ofM
的长度大于 中的元素数,则w
需要在相乘之前选择一个范围axis=2
,M
如下所示 -
M[...,np.arange(w.size),:] *= w[:,None]
这个答案是基于我试图理解@Divakar 的答案。帮助我理解正在发生的事情是写下他们的建议
M *= w[:,None]
作为
M *= w[None,None,:,None]
现在 M 和扩展 w 的尺寸明显相同。当然,@Divakar 的版本更短,更优雅,但不那么直观。
因此,一个完整的工作示例是:
import numpy as np
M = np.ones((1,4,3,2))
w = np.arange(3)
M *= w[None,None,:,None]
print M