Spe*_*ill 3 python numpy multidimensional-array
(这个问题类似于沿轴的多维权重的Numpy平均,但更复杂.)
我有一个numpy的阵列,d,d.shape=(16,3,90,144),和一个numpy的权重的阵列,e,e.shape=(16,3).我想a使用沿轴1 的加权平均值e.所以输出应该是一个有形状的numpy数组(16,90,144).我可以通过列表理解来实现这一目标:
np.array([np.average(d[n], weights=e[n], axis=0) for n in range(16)])
Run Code Online (Sandbox Code Playgroud)
但正如在上一个问题中,我想避免必须从列表转换回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
Run Code Online (Sandbox Code Playgroud)
这里检查计算返回与列表推导相同的结果:
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
Run Code Online (Sandbox Code Playgroud)