我有以下代码,其中w是兼容维度的1D numpy数组,M是4D数组,
i = 0
for weight in w:
M[:, :, i, :] *= weight
i += 1
有没有更好的方法来达到同样的效果?
答案 0 :(得分:3)
您正使用来自M
的{{1}}数组axis=2
的{{1}}进行w
缩放。因此,您需要将1D
扩展为包含np.newaxis/None
的2D数组,这将使w
与extended version of w
之间的轴对齐。然后,在这两个数组之间执行逐元素乘法,为broadcasting
引入矢量化解,就像这样 -
M
如果M *= w[:,None]
的{{1}}长度超过axis=2
中的元素数量,则需要选择M
中w
的范围在乘之前,就像这样 -
axis=2
答案 1 :(得分:1)
这个答案是基于我试图了解@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