この記事ではnp.arrayの要素の平均を計算する関数、np.mean関数を紹介します。
また、この関数はnp.arrayのメソッドとしても実装されています。
NumPyでは、生のPythonで実装された関数ではなく、NumPyに用意された関数を使うことで高速な計算が可能です。
この記事でNumPyを使った効率的な計算の仕方について勉強していきましょう。
np.meanの引数と返り値
numpy.
mean
(a, axis=None, dtype=None, out=None, keepdims=<no value>)
axisで指定した軸に沿った算術平均(よく使う普通の平均)を計算します。
Parameters: |
|
---|---|
Returns: |
|
meanメソッドのパラメータもほぼ同様です。
第一引数の代わりに、メソッドを呼び出したオブジェクト自体が使われることに注意してください。
使い方
以降のコードはJupyterで実行してみてください。
まずはNumPyをimportして、解説のためのサンプル配列を用意します。
In [1]: import numpy as np In [2]: x = np.arange(10) x2 = np.reshape(x,(2,5)) print("x\n",x) print("x2\n",x2)
Out:
基本的な使い方
np.meanもarr.meanも使い方は同じです。
また、使い方はnp.sumとほぼ同じなので、こちらがわかってる場合は簡単に使いこなせるでしょう。
まずはaxisを指定しない場合、配列内の要素全てを使って平均値を計算します。
In [3]: np.mean(x) Out[3]: 4.5 In [4]: x.mean() Out[4]: 4.5 In [5]: np.mean(x2) Out[5]: 4.5 In [6]: x2.mean() Out[6]: 4.5
axisで平均値を出す軸を指定
axis=0とすると、列ごとに平均値を計算します。
axis=1とすると、行ごとに平均値を計算します。
In [7]: np.mean(x2, axis=0) Out[7]: array([2.5, 3.5, 4.5, 5.5, 6.5]) In [8]: x2.mean(axis=0) Out[8]: array([2.5, 3.5, 4.5, 5.5, 6.5]) In [9]: np.mean(x2, axis=1) Out[9]: array([2., 7.]) In [10]: x2.mean(axis=1) Out[10]: array([2., 7.])
outパラメータで出力値を入れる配列を用意
sumの出力配列と同じshapeの配列を用意して、outに渡すとその配列を上書きして答えを返してくれます。
新しい配列を作らない分だけ高速に動作します。
このあたりはnp.sumと同様です。
dtypeで出力配列の型を指定
dtypeを指定しないと、適当な型が割り当てられます。
例えばx3の中身を見てみると、float64になっていますね。
これは平均値を計算した配列がfloat64型だったためです。
これを敢えて変更したい場合はdtypeに型を指定しましょう。
In [14]: x3.dtype Out[14]: dtype('float64') In [15]: x4 = np.mean(x2, axis=1, dtype=np.float32) x4 Out[15]: array([2., 7.], dtype=float32)
NaNが入った配列の要素和を計算する
配列内にNaNが入っている場合、通常のnp.meanやarr.meanでは計算結果がNaNになってしまいます。
この場合、NaNを無視して平均値を出すには、np.nanmean関数を使います。
In [19]: np.nanmean(x5) Out[19]: 1.5
nanmeanはnanの分は無視して計算しているため、x5の要素数が3ですが、nanの分を抜いた要素数(2)で割っていることに注意が必要です。
また、np.nansum関数は通常のnp.sum関数と比べて計算速度が遅いので、nanが入っている可能性がある場合にだけ使う事をおすすめします。
%%timeit
np.nanmean(x2)
%%timeit
np.mean(x2)
まとめ
この記事では、np.arrayから平均値を計算する機能、np.meanとnp.arrayのメソッドarr.meanを紹介しました。
mean関数、meanメソッドなどのNumPyの中の関数で計算を完結させる事ができれば、非常に高速な計算が実現できます。
是非この記事で使い方を覚えて、科学計算や機械学習の実装に役立ててください!
今回の記事は下記の記事を参考にしています。
参考記事: