(这个问题类似于沿轴使用多维权重的 Numpy 平均,但更复杂。
我有一个 numpy 数组,d
、 d.shape=(16,3,90,144)
和一个权重的 numpy 数组,e
、 e.shape=(16,3)
。我想使用 e
沿轴 1 取 a
的加权平均值。所以输出应该是一个形状为 (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
)。
有人可以帮忙吗?谢谢!
直接使用np.average
会很好。但是,要做到这一点,d
和权重e
必须具有相同的形状,并且广播在这里不是为您隐式完成的。
显式广播e
(使用 np.broadcast_arrays
),使其具有与d
相同的形状是可能的,但浪费内存。因此,与其这样做,不如偷看定义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