3

(この質問は、軸に沿った多次元の重みを使用した Numpy の平均化に似ていますが、より複雑です。)

numpy 配列 ,dd.shape=(16,3,90,144)numpy 配列の重み ,eがありe.shape=(16,3)ます。aを使用して、軸 1に沿って の加重平均を取りたいと思いeます。したがって、出力は shape の 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 に答える