Numpy对4D数组进行加权平均,使用2D权重数组且不使用列表推导
这个问题和Numpy使用多维权重沿某个轴进行平均的内容类似,但更复杂一些。
我有一个numpy数组,叫做d
,它的形状是d.shape=(16,3,90,144)
,还有一个权重数组e
,它的形状是e.shape=(16,3)
。我想用e
对a
在轴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