在numpy数组中对飞机进行加权的最好方法是什么?

时间:2016-02-08 11:12:50

标签: python numpy numpy-broadcasting

我有以下代码,其中w是兼容维度的1D numpy数组,M是4D数组,

i = 0
for weight in w:
    M[:, :, i, :] *= weight
    i += 1

有没有更好的方法来达到同样的效果?

2 个答案:

答案 0 :(得分:3)

您正使用来自M的{​​{1}}数组axis=2的{​​{1}}进行w缩放。因此,您需要将1D扩展为包含np.newaxis/None的2D数组,这将使wextended version of w之间的轴对齐。然后,在这两个数组之间执行逐元素乘法,为broadcasting引入矢量化解,就像这样 -

M

如果M *= w[:,None] 的{​​{1}}长度超过axis=2中的元素数量,则需要选择Mw的范围在乘之前,就像这样 -

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