12

Python で複数の (同じ長さの) リストの平均を計算する簡単な方法はありますか? 私は を持っていて[[1, 2, 3], [5, 6, 7]]、 を入手したいとし[3,4,5]ます。これは 100000 回実行されるため、高速化する必要があります。

4

4 に答える 4

27

使用している場合numpy(ここではより適切と思われます):

>>> import numpy as np
>>> data = np.array([[1, 2, 3], [5, 6, 7]])
>>> np.average(data, axis=0)
array([ 3.,  4.,  5.])
于 2012-12-01T17:21:21.200 に答える
5
In [6]: l = [[1, 2, 3], [5, 6, 7]]

In [7]: [(x+y)/2 for x,y in zip(*l)]
Out[7]: [3, 4, 5]

(整数演算と浮動小数点演算のどちらが必要か、および使用する除算の種類を決定する必要があります。)

私のコンピュータでは、上記は 1.24us かかります:

In [11]: %timeit [(x+y)/2 for x,y in zip(*l)]
1000000 loops, best of 3: 1.24 us per loop

したがって、100,000 の入力を処理するには 0.124 秒かかります。

興味深いことに、NumPy 配列は、このような小さな入力では遅くなります。

In [27]: In [21]: a = np.array(l)

In [28]: %timeit (a[0] + a[1]) / 2
100000 loops, best of 3: 5.3 us per loop

In [29]: %timeit np.average(a, axis=0)
100000 loops, best of 3: 12.7 us per loop

入力が大きくなると、相対的なタイミングは間違いなく変化します。

于 2012-12-01T17:15:26.277 に答える
2

平均化するサブリストを含むnリストの場合、NPE の回答を拡張します。

def average(l):
    llen = len(l)
    def divide(x): return x / llen
    return map(divide, map(sum, zip(*l)))

これにより、すべてのサブリストが合計され、その結果がサブリストの数で除算されて平均が算出されます。len計算をインラインdivide化して のようなラムダに変換することもできますがlambda x: x / len(l)、明示的な関数を使用して長さを事前に計算すると、少し速くなるはずです。

于 2012-12-01T17:29:20.407 に答える
0

RGB ピクセルでスムーズに作業するためのわずかに変更されたバージョン:

def average(*l):
  l=tuple(l)
  def divide(x): return x // len(l)
  return list(map(divide, map(sum, zip(*l))))
print(average([0,20,200],[100,40,100]))
>>> [50,30,150]
于 2021-09-02T20:16:21.380 に答える