3

(这个问题类似于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)])

但与上一个问题一样,我想避免将列表转换回 numpy 数组。这种情况比前一个问题更复杂,因为每次的权重都不相同(即weights=e[n],不weights=b)。

有人可以帮忙吗?谢谢!

4

1 回答 1

7

直接使用就好了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
于 2013-01-26T19:25:16.670 回答