NumPyのaverage関数で配列の加重平均を取得する方法

NumPyのaverage関数は、配列の加重平均を算出することができる関数です。通常の算術平均を算出することも可能です。

データエンジニアリングの中では、データの加重平均が求められる場合も多々あります。そのような時のために、このページでは、このnp.average関数について、簡潔かつわかりやすく解説します。

なお、同じような関数にmean関数がありますが、こちらは算術平均を求めるのに特化しています。通常の平均値を取得する場合はmean関数を、加重平均を取得する場合はaverage関数を使うというようにすれば良いでしょう。

それでは早速確認していきましょう。

NumPy配列の平均値の操作まとめ
NumPy配列の平均を操作する全方法については、『NumPyで平均値を求める3つの関数の使い方まとめ』ですべてまとめています。ぜひ一度ご確認ください。

目次

1. 書式

まずは基本的な書き方を確認しましょう。

numpy.average関数

書き方:

np.average(a, axis=None, weights=None, returned=False)
引数 データ型 解説
a array_like   平均を求めたいデータを渡す。
axis* None または int もしくは tuple of ints 平均を求める次元軸を渡す。デフォルトのNoneでは、全要素の平均を求める。整数のタプルを渡した場合は、指定の軸の全ての要素の平均を求める。
weights*  array_like 加重平均を求める際の重みを渡す。1次元配列で渡す場合は、指定の軸の長さと同じである必要がある。それ以外の場合は、a と同じshapeである必要がある。
returned*  ブール値 デフォルトはFalse。Trueにすると、(平均値, 重みの合計)のタプルが戻る。weightsを指定しない場合は、(平均値, 指定の軸の要素数)が戻る。
* はオプション引数であることを示します。

戻り値: 

平均値、平均値の配列、または平均値と重みの合計値のタプル
指定の軸の平均値(加重平均)を返します。オプション引数returned=Trueの場合は、(平均値, 重みの合計値)のタプルを返します。戻り値の要素のデータ型は、weightsを指定していない場合は、元の配列aと同じになります。元の配列aとweightsのデータ型が異なる場合は、可能な最も精度の低いデータ型になります。

例外: 

ZeroDivisionError: 指定の軸の重みが0の場合
TypeError: 重みを指定する配列のshapeが合致しない場合

一緒に確認したい関数:

  • mean: 配列の要素の算術平均を取得
  • ma.average
  • numpy.result_type

2. サンプルコード

それでは早速サンプルコードを見ていきましょう。

平均を取得する

np.average関数に配列のみを渡すと、全要素の算術平均を返します。

In [1]:
import numpy as np
rng = np.random.default_rng()
x =rng.integers(0, 10, (5))
x
Out[1]:
array([2, 4, 8, 5, 7])
In [2]:
np.average(x)
Out[2]:
5.2

平均値を求める次元軸を指定

多次元配列を渡した場合でも、配列内の全要素の平均を求めます。

In [1]:
import numpy as np
rng = np.random.default_rng()
x =rng.integers(0, 10, (2, 5))
x
Out[1]:
array([[1, 6, 8, 9, 2],
       [0, 2, 5, 4, 5]])
In [2]:
np.average(x)
Out[2]:
4.2

特定の次元軸の平均値を取得したい場合は、オプション引数 axis= で指定します。

In [3]:
#  1次元軸(縦軸)の平均値を取得
np.average(x, axis=0)
Out[3]:
array([0.5, 4. , 6.5, 6.5, 3.5])
In [4]:
#  2次元軸(横軸)の平均値を取得
np.average(x, axis=1)
Out[4]:
array([5.2, 3.2])

加重平均を取得する

加重平均を求めるには、重みを配列やリスト・タプルなどで渡します。重みの要素数は、関数に渡す配列 x の長さと一致している必要があります。

In [1]:
import numpy as np
x = np.array([60, 75, 80])
x
Out[1]:
array([60, 75, 80])
In [2]:
# 重みを渡す
np.average(x, weights=[3, 2, 1])
Out[2]:
68.33333333333333

2次元配列の場合は、対象の配列と重みの配列のshapeが合致している必要があります。

In [1]:
import numpy as np
x = np.array([40, 60, 75, 80]).reshape(2, 2)
x
Out[1]:
array([[40, 60],
       [75, 80]])
In [2]:
w = np.array([4, 3, 2, 1]).reshape(2, 2)
w
Out[2]:
array([[4, 3],
       [2, 1]])
In [3]:
np.average(x, weights=w)
Out[3]:
57.0

もちろん、指定の軸ごとに加重平均を取得することも可能です。この場合、weights= に渡す重みの長さは、指定の軸の要素数と同じであるか、両者の配列のshapeが合致している必要があります。

In [4]:
# 1次元軸(横軸)の加重平均を取得
np.average(w, axis=0, weights=[3, 1])
Out[4]:
array([3.5, 2.5])
In [5]:
# 2次元軸(縦軸)の加重平均を取得
np.average(w, axis=1, weights=[5, 3])
Out[5]:
array([3.625, 1.625])

平均値と同時に重みの合計値を取得

オプション引数で returned=True と指定すると、戻り値は (平均値を要素とした配列, 重みの合計を要素とした配列) のタプルになります。

以下のコードでご確認ください。

In [1]:
import numpy as np
x = np.array([40, 60, 75, 80])
x
Out[1]:
array([40, 60, 75, 80])
In [2]:
w = np.array([4, 3, 2, 1])
w
Out[2]:
array([4, 3, 2, 1])
In [3]:
np.average(x, weights=w, returned=True)
Out[3]:
(57.0, 10.0)

軸を指定した場合は、それぞれの軸ごとに[平均値, 重みの合計]のタプルを返します。

In [4]:
import numpy as np
x = x.reshape(2, 2)
In [5]:
w = np.array([3, 3, 2, 2]).reshape(2, 2)
w
Out[5]:
array([[3, 3],
       [2, 2]])
In [6]:
np.average(x, axis=0, weights=w, returned=True)
Out[6]:
(array([54., 68.]), array([5., 5.]))

3. まとめ

以上が、NumPyのaverage関数の使い方です。

冒頭でも述べましたが、通常の算術平均を取得する場合は、mean関数の方が便利です。そちらでは、dtype=keepdims のようなオプション引数が用意されているので複雑な計算に組み込みやすいからです。『NumPyのmean関数で配列の平均値を算出する方法』でご確認ください。



よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次
閉じる