Numpy对4D数组进行加权平均,使用2D权重数组且不使用列表推导

4 投票
1 回答
1603 浏览
提问于 2025-04-17 13:46

这个问题和Numpy使用多维权重沿某个轴进行平均的内容类似,但更复杂一些。

我有一个numpy数组,叫做d,它的形状是d.shape=(16,3,90,144),还有一个权重数组e,它的形状是e.shape=(16,3)。我想用ea在轴1上进行加权平均。这样输出的结果应该是一个形状为(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 个回答

8

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

撰写回答