2021年6月27日日曜日

【Numpy】ndarray任意の行・列の合計、平均

外部モジュールNumPyの配列型データ構造であるndarrayで特定の軸の要素の合計、平均の求め方について説明する。

Numpyを使う際にはimportが必要。しばしばnpと略される。

import numpy as np


1. numpy.sumによる要素の合計

sumは1つのndarray内の要素の最大値を求める。引数にaxisを指定すると行ごと、列ごとの合計が求まる。
書式は以下。

numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)

1次元のndarrayの場合。全要素の合計が求まる。戻り値はスカラー。1軸しかないのでaxisは指定しない。

import numpy as np

np.sum([2, 3, 4])

実行結果

9


2行3列の2次元のndarrayの場合。axisを指定しない場合、全要素の合計が求まる。

import numpy as np

np.sum([[2,3,4],[6,5,1]])

実行結果

21


2行3列の2次元のndarrayaxis=0を指定した場合。各列の合計が求まる(行方向、つまり縦に足される)。

import numpy as np

np.sum([[2,3,4],[6,5,1]], axis=0)

実行結果

array([8, 8, 5])


2行3列の2次元のndarrayaxis=1を指定した場合。各行の合計が求まる(列方向、つまり横に足される)。

import numpy as np

np.sum([[2,3,4],[6,5,1]], axis=1)

実行結果

array([ 9, 12])


initialに値を与えると、その値が加算された結果となる。

import numpy as np

np.sum([[2,3,4],[6,5,1]], axis=1, initial=100)

実行結果

array([109, 112])


whereは要素の採用/不採用を決める。Trueの要素は加算され、Falseの要素は無視される。
各行の1つ目の要素(2,6)はFalseなので無視され、Trueである2つ目、3つ目の要素が合計される。

import numpy as np

np.sum([[2,3,4],[6,5,1]], axis=1, where=[False, True, True])

実行結果

array([7, 6])


2. numpy.ndarray.sumによる要素の合計

ndarray.sumsumと同じ結果が得れる。

ndarray.sum(axis=None, dtype=None, out=None, keepdims=False, initial=0, where=True)


2行3列の2次元のndarrayaxis=1を指定した場合。各行の合計が求まる(列方向、つまり横に足される)。

import numpy as np

a = np.array([[2,3,4],[6,5,1]])
a.sum(axis=1)

実行結果

array([ 9, 12])


3. numpy.meanによる要素の平均

meanは1つのndarray内の要素の平均を求める。引数にaxisを指定すると行ごと、列ごとの平均が求まる。
書式は以下。

numpy.mean(a, axis=None, dtype=None, out=None, keepdims=<no value>, *, where=<no value>)


2行3列の2次元のndarray全要素の平均を求める場合。axisを指定しない。

import numpy as np

np.mean([[2,3,4],[6,5,1]])

実行結果

3.5


2行3列の2次元のndarrayaxis=0を指定、各列の平均が求まる(行方向の平均)

import numpy as np

np.mean([[2,3,4],[6,5,1]], axis=0)

実行結果

array([4. , 4. , 2.5])


2行3列の2次元のndarrayaxis=1を指定、各行の平均が求まる(列方向の平均)

import numpy as np

np.mean([[2,3,4],[6,5,1]], axis=1)

実行結果

array([3., 4.])


4. numpy.averageによる要素の平均

averagemean同様に1つのndarray内の要素の平均を求める。meanと異なる点は、引数にweightsを指定することでウエイトを掛けた平均が求められる点。
書式は以下。

numpy.average(a, axis=None, weights=None, returned=False)


2行3列の2次元のndarrayaxis=0を指定、各列の平均が求まる(行方向の平均)。meanと同じ結果となる

import numpy as np

np.average([[2,3,4],[6,5,1]], axis=0)

実行結果

array([4. , 4. , 2.5])


引数weightsを指定すると要素にそれを掛けた平均が求まる
以下の計算式で計算される。

avg = sum(a * weights) / sum(weights)

次の例ではweightsとして0.5と2を指定している。これにより計算は
(2*0.5+6*2)/(0.5+2)
(3*0.5+5*2)/(0.5+2)
(4*0.5+1*2)/(0.5+2)
となりweightsの掛かった平均が求められる。

import numpy as np

np.average([[2,3,4],[6,5,1]], axis=0, weights=[0.5,2])

実行結果

array([5.2, 4.6, 1.6])


5. リファレンス

NumPy > numpy.sum
NumPy > numpy.ndarray.sum
NumPy > numpy.mean
NumPy > numpy.average

使用バージョン:Python 3.7.0/numpy 1.18.4

0 件のコメント:

コメントを投稿