(这个问题类似于Numpy averaging with multi-dimensional weights along an axis,但更复杂。)
我有一个numpy数组,d
,d.shape=(16,3,90,144)
和一系列权重e
,e.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
)。
有人可以帮忙吗?谢谢!
答案 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