2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

np.meanとnp.average速さ対決

Last updated at Posted at 2020-11-10

 NumPyで平均をとる方法としてnp.meannp.averageの2つがある(他にもあるかも知れないが)。ここでは、その二つの違いに関しては他の記事に任せるとして、処理速度としてはどちらが優秀なのかを見ていく。
 なお、以下のコードはこのサイトを参考した。

実行環境

CentOS Linux release 7.6.1810 (Core)
Python 3.8.5

実行コード1

まずは単純に1次元の配列を平均する。

test1.py
import timeit
import numpy as np

def func_average(n):
    return np.average(np.arange(n**2))

def func_mean(n):
    return np.mean(np.arange(n**2))

n = 1000
loop = 1000

result_average = timeit.timeit(lambda: func_average(n), number=loop)
result_mean = timeit.timeit(lambda: func_mean(n), number=loop)

print('average: ', result_average / loop)
print('mean:    ', result_mean / loop)

実行結果

average:  0.0015093836802989244
mean:     0.001964871450792998

この他にも4回計測したが、いずれもnp.averageが20~30%ほど速かった。

実行コード2

次に、2次元配列の平均をとる。

test.py
import timeit
import numpy as np

def func_average(n):
    return np.average(np.arange(n**2).reshape(n, n))

def func_mean(n):
    return np.mean(np.arange(n**2).reshape(n, n))

n = 1000
loop = 1000

result_average = timeit.timeit(lambda: func_average(n), number=loop)
result_mean = timeit.timeit(lambda: func_mean(n), number=loop)

print('average: ', result_average / loop)
print('mean:    ', result_mean / loop)

実行結果

average:  0.0016613604403100909
mean:     0.002270303561817855

こちらの場合でも、np.averageが速かった。

考察

 他にも似たような条件を試してみたのだが、どうやってもnp.averageの方が計算速度が速いという結果が出た。これはnp.meanの意味が無いのでは...
 さすがにそんなはずはないと思い、さらに検索してみるとこのようなスレッドを発見。以下翻訳、改変して引用:

(上略)
averagemeanの考慮すべき違いは他にもある(この前のスレッドで違いが他にも述べられている)。averageはmaskを考慮せずに配列の値全部の平均を取るのに対して、meanはmaskを考慮するため、maskされていない値のみで平均を取る。

g = [1,2,3,55,66,77] 
f = np.ma.masked_greater(g,5) # 5より大きい値をマスクする -> [1,2,3,--,--,--]

print(np.average(f)) # 34.0 (= (1+2+3+55+66+77) / 6)
print(np.mean(f)) # 2.0 (= (1+2+3) / 3)

なるほど、欠損値を含む配列を扱う場合はmeanを使うべきであるようである。

結論

  • 単純な処理速度だけでいえばaverage
  • 欠損値を含むデータを扱うなどでnumpy.maを使う場合は、mean

用途に応じて使い分けるのが一番だが、プログラム全体にかかる時間からするとそれに占めるaveragemeanの割合は微々たるものであると思うため、何も考えずmeanを使うという選択肢もアリではなかろうか。

2
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?