2013-10-15 11 views
17

Numpy/Pythonを使用すると、単一の関数呼び出しから平均AND分散を返すことは可能ですか?シングル関数のナンシー平均と分散?

私はそれらを別々に行うことができますが、サンプルの標準偏差を計算するには平均値が必要です。したがって、平均と分散を得るために別々の関数を使用すると、不必要なオーバーヘッドが追加されます。

ここでnumpyのドキュメントを調べてみましたが(http://docs.scipy.org/doc/numpy/reference/routines.statistics.html)、成功しませんでした。

+0

なぜnumpy.stdを使用しないのですか?あるいは、標準偏差以外の何かを計算したいですか? – Greg

答えて

24

あなたはnp.stdnp.varに知られている平均値を渡すことはできません、あなたはnew standard library statistics moduleを待つ必要があるでしょうが、その間に、あなたが式を使って、少し時間を節約することができます。

In [329]: a = np.random.rand(1000) 

In [330]: %%timeit 
    .....: a.mean() 
    .....: a.var() 
    .....: 
10000 loops, best of 3: 80.6 µs per loop 

In [331]: %%timeit 
    .....: m = a.mean() 
    .....: np.mean((a-m)**2) 
    .....: 
10000 loops, best of 3: 60.9 µs per loop 

In [332]: m = a.mean() 

In [333]: a.var() 
Out[333]: 0.078365856465916137 

In [334]: np.mean((a-m)**2) 
Out[334]: 0.078365856465916137 

の場合あなたは本当に(つまり、ドット積が何であるかだから)乗との加算を行うためにnp.dotをしようと、物事をスピードアップしようとしている。

In [335]: np.dot(a-m,a-m)/a.size 
Out[335]: 0.078365856465916137 

In [336]: %%timeit 
    .....: m = a.mean() 
    .....: c = a-m 
    .....: np.dot(c,c)/a.size 
    .....: 
10000 loops, best of 3: 38.2 µs per loop 
+1

印象的なもの! – Ginger

+5

将来の読者のために:[統計モジュールはPython 3.4で追加されました](https://docs.python.org/3/library/statistics.html)、分散関数は処理時間を節約するために既に計算された平均を渡すことができます。私はそれのパフォーマンスがどれくらいnumpyと比較されているか分かりません。 –

0

あなたはまた、平均値との関係を利用して減算を避けることができ、分散信号のパワー:

In [7]: import numpy as np 

In [8]: a = np.random.rand(1000) 

In [9]: %%timeit 
    ...: a.mean() 
    ...: a.var() 
    ...: 
10000 loops, best of 3: 24.7 us per loop 

In [10]: %%timeit 
    ...: m = a.mean() 
    ...: np.mean((a-m)**2) 
    ...: 
100000 loops, best of 3: 18.5 us per loop 

In [11]: %%timeit 
    ...: m = a.mean() 
    ...: power = np.mean(a ** 2) 
    ...: power - m ** 2 
    ...: 
100000 loops, best of 3: 17.3 us per loop 

In [12]: %%timeit 
    ...: m = a.mean() 
    ...: power = np.dot(a, a)/a.size 
    ...: power - m ** 2 
    ...: 
100000 loops, best of 3: 9.16 us per loop