【NumPy入門 np.mean】配列の要素の平均を求める方法

この記事ではnp.arrayの要素の平均を計算する関数np.mean関数を紹介します。

また、この関数はnp.arrayのメソッドとしても実装されています。

NumPyでは、生のPythonで実装された関数ではなく、NumPyに用意された関数を使うことで高速な計算が可能です。

この記事でNumPyを使った効率的な計算の仕方について勉強していきましょう。

目次

np.meanの引数と返り値

numpy.mean(aaxis=Nonedtype=Noneout=Nonekeepdims=<no value>)

axisで指定した軸に沿った算術平均(よく使う普通の平均)を計算します。

Parameters:
a : array_like(np.arrayやlist)

平均値を計算したい配列

axis : None(指定しない) or int型 or int型の入ったtuple型, optional

meanが計算される範囲(軸)を指定するパラメータ

dtype : data-type, optional

返り値の配列の型を指定します。

指定しない場合はfloat64になります。

out : ndarray, optional

出力される配列を代用する配列を指定できます。

このパラメータに既存の配列を指定すると、新しい配列を作らずに既存の配列を使いまわします。

keepdims : bool, optional
Returns:
m : ndarray, see dtype parameter above

平均値を収めた配列を返します。

outに配列を指定した場合は、その配列への参照が返されます。

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:

x
 [0 1 2 3 4 5 6 7 8 9]
x2
 [[0 1 2 3 4]
 [5 6 7 8 9]]

基本的な使い方

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と同様です。

In [11]:

x3 = np.zeros(2)
x3

Out[11]:

array([0., 0.])

In [12]:

np.mean(x2, axis=1, out=x3)
x3

Out[12]:

array([2., 7.])

In [13]:

x2.mean(axis=1, out=x3)
x3

Out[13]:

array([2., 7.])

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になってしまいます。

In [16]:

x5 = np.array([np.nan, 1.0, 2.0])

In [17]:

np.mean(x5)

Out[17]:

nan

In [18]:

x5.mean()

Out[18]:

nan

この場合、NaNを無視して平均値を出すには、np.nanmean関数を使います。

In [19]:

np.nanmean(x5)

Out[19]:

1.5

nanmeanはnanの分は無視して計算しているため、x5の要素数が3ですが、nanの分を抜いた要素数(2)で割っていることに注意が必要です。

また、np.nansum関数は通常のnp.sum関数と比べて計算速度が遅いので、nanが入っている可能性がある場合にだけ使う事をおすすめします。

In [20]:
%%timeit 
np.nanmean(x2)
[計算速度]
11.1 µs ± 88.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [21]:
%%timeit 
np.mean(x2)
[計算速度]
6.57 µs ± 55 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

まとめ

この記事では、np.arrayから平均値を計算する機能、np.meanとnp.arrayのメソッドarr.meanを紹介しました。

mean関数、meanメソッドなどのNumPyの中の関数で計算を完結させる事ができれば、非常に高速な計算が実現できます。

是非この記事で使い方を覚えて、科学計算や機械学習の実装に役立ててください!

今回の記事は下記の記事を参考にしています。
参考記事:

この記事を書いた人

第一言語はPythonです。
皆さんRustやりましょう。

目次