4D阵列的Numpy加权平均值,具有2D列表权重而没有列表理解

时间:2013-01-26 19:13:16

标签: python multidimensional-array numpy

(这个问题类似于Numpy averaging with multi-dimensional weights along an axis,但更复杂。)

我有一个numpy数组,dd.shape=(16,3,90,144)和一系列权重ee.shape=(16,3)。我想使用a沿轴1加权e。所以输出应该是一个形状为(16,90,144)的numpy数组。我可以通过列表理解来实现这一目标:

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

但是和上一个问题一样,我想避免将列表转换回numpy数组。这种情况比前一个问题更复杂,因为权重每次都不相同(即weights=e[n],而不是weights=b)。

有人可以帮忙吗?谢谢!

1 个答案:

答案 0 :(得分:6)

直接使用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