4D 数组的 numpy 加权平均值,具有没有列表理解的 2D 权重数组



(这个问题类似于沿轴使用多维权重的 Numpy 平均,但更复杂。

我有一个 numpy 数组,dd.shape=(16,3,90,144) 和一个权重的 numpy 数组,ee.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

相关内容

  • 没有找到相关文章

最新更新