(这个问题类似于Numpy averaging with multi-dimensional weights along an axis,但更复杂。)
我有一个numpy数组,dd.shape=(16,3,90,144)和一个numpy权重数组,ee.shape=(16,3)我想用a沿轴1取e的加权平均值。所以输出应该是一个numpy数组,其形状(16,90,144)我可以通过一个列表理解来完成这个任务:

np.array([np.average(d[n], weights=e[n], axis=0) for n in range(16)])

但和前面的问题一样,我希望避免从列表转换回numpy数组这种情况比前一个问题更复杂,因为每次的权重都不相同(即weights=e[n],而不是weights=b)。
有人能帮忙吗?谢谢!

最佳答案

最好直接使用np.average。但是,要做到这一点,d和权重e必须具有相同的形状,并且广播在这里不是为您隐式地完成的。
显式广播e(使用np.broadcast_arrays)使其具有与d相同的形状是可能的,但会浪费内存。因此,与其这样做,不如看看source code defining numpy.average并尝试重新计算:

In [121]: d = np.random.random((16,3,90,144))

In [122]: e = np.random.random((16,3))

In [123]: f = e[:,:,None,None]

In [124]: scl = f.sum(axis = 1)

In [125]: avg = np.multiply(d,f).sum(axis = 1)/scl

下面检查计算返回的结果是否与列表理解相同:
In [126]: avg_lc = np.array([np.average(d[n], weights=e[n], axis=0) for n in range(d.shape[0])])

In [127]: np.allclose(avg, avg_lc)
Out[127]: True

关于python - 没有列表理解的2D权重数组的4D数组的Numpy加权平均值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14540569/

10-09 22:50
查看更多