note.nkmk.me

NumPy配列の行・列ごとの合計、平均、最大、最小などを算出

Date: 2017-09-02 / Modified: 2018-03-05 / tags: Python, NumPy

numpy.sum()を使うとNumPy配列ndarrayの合計値、numpy.mean()を使うとndarrayの平均値を求められる。

デフォルトではndarray全体の合計や平均が算出されるが、引数axisを渡すことで行ごとや列ごとの結果を得ることができる。

ここでは、以下の内容について説明する。

  • numpy.sum(): 合計
  • numpy.mean(): 平均
  • numpy.min(): 最小 / numpy.max(): 最大
  • そのほか(numpy.std(): 標準偏差 / numpy.var(): 分散など)
  • 多次元配列に対する引数axis

例として3 x 4の配列を準備する。

import numpy as np

a = np.arange(12).reshape(3, 4)
print(a.shape)
print(a)
# (3, 4)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]
スポンサーリンク

numpy.sum(): 合計

np.sum()に配列ndarrayを渡すと、すべての要素の合計値が返ってくる。

print(np.sum(a))
# 66

ここで、引数axis0を渡すと列ごとの合計値、1を渡すと行ごとの合計値が得られる。

print(np.sum(a, axis=0))
print(np.sum(a, axis=1))
# [12 15 18 21]
# [ 6 22 38]

関数np.sum()ではなく、ndarrayのメソッドsum()も用意されている。ここでも引数axisを指定できる。

print(a.sum())
# 66

print(a.sum(axis=0))
print(a.sum(axis=1))
# [12 15 18 21]
# [ 6 22 38]

numpy.mean(): 平均

平均値を算出するnp.mean()でも同様。

引数axisを指定すると、列ごと・行ごとの結果となる。

print(np.mean(a))
# 5.5

print(np.mean(a, axis=0))
print(np.mean(a, axis=1))
# [ 4.  5.  6.  7.]
# [ 1.5  5.5  9.5]

sum()と同じくmean()ndarrayのメソッドとして呼び出すことができる。

print(a.mean())
# 5.5

print(a.mean(axis=0))
print(a.mean(axis=1))
# [ 4.  5.  6.  7.]
# [ 1.5  5.5  9.5]

numpy.min(): 最小値 / numpy.max(): 最大値

合計、平均だけでなく、最小値を求めるnp.amin()、最大値を求めるnp.amax()などでも同様に行ごと、列ごとの結果を算出できる。

ちなみに、np.min()np.amin()のエイリアス、np.max()np.amax()のエイリアスとして設定されているので、そちらを使ってもOK。

ndarrayのメソッドとして呼び出すこともできる。

print(np.min(a))
print(np.min(a, axis=0))
# 0
# [0 1 2 3]

print(a.max())
print(a.max(axis=1))
# 11
# [ 3  7 11]

そのほか(numpy.std(): 標準偏差 / numpy.var(): 分散など)

ほかにも、標準偏差を求めるnp.std()や分散を求めるnp.var()など、いろいろな関数で引数axisを設定できるようになっており、行ごと、列ごとの結果を簡単に得られる。

そのほかの関数やndarrayのメソッドについては以下のリンクを参照。

多次元配列に対する引数axis

2次元の配列については、引数axis0を渡すと列ごと、1を渡すと行ごとの演算結果が得られると考えておけば問題ないが、引数axisに設定する値の意味について少し詳しく説明したい。

2 x 3 x 4の配列を準備する。

b = np.arange(24).reshape(2, 3, 4)
print(b.shape)
print(b)
# (2, 3, 4)
# [[[ 0  1  2  3]
#   [ 4  5  6  7]
#   [ 8  9 10 11]]
#  [[12 13 14 15]
#   [16 17 18 19]
#   [20 21 22 23]]]

これにaxis=0を渡すと次のような結果になる。なお、例としてsum()を使っているが、mean()min()など、ほかの関数、メソッドでも考え方は同じ。

print(b.sum(axis=0))
# [[12 14 16 18]
#  [20 22 24 26]
#  [28 30 32 34]]

結果は3 x 4の配列になっている。

axis=1とすると、

print(b.sum(axis=1))
# [[12 15 18 21]
#  [48 51 54 57]]

となり、結果は2 x 4の配列。

さらに、axis=2の場合、

print(b.sum(axis=2))
# [[ 6 22 38]
#  [54 70 86]]

結果は2 x 3の配列となる。

元の配列の大きさは2 x 3 x 4なので、axisで設定した軸(次元)に対して演算が行われ、ほかの軸のサイズがそのまま結果のサイズとなっている。

original : 2 x 3 x 4
axis=0   : _ x 3 x 4 -> 3 x 4
axis=1   : 2 x _ x 4 -> 2 x 4
axis=2   : 2 x 3 x _ -> 2 x 3

例えば、sum(axis=0)sum(axis=1)sum(axis=2)は以下の演算と同義。

print(b[0, :, :] + b[1, :, :])
# [[12 14 16 18]
#  [20 22 24 26]
#  [28 30 32 34]]
print(b[:, 0, :] + b[:, 1, :] + b[:, 2, :])
# [[12 15 18 21]
#  [48 51 54 57]]
print(b[:, :, 0] + b[:, :, 1] + b[:, :, 2] + b[:, :, 3])
# [[ 6 22 38]
#  [54 70 86]]

また、axisにはタプルで複数の値を設定することもできる。このときも考え方は同じ。

original     : 2 x 3 x 4
axis=(0, 1)  : _ x _ x 4 -> 4
axis=(0, 2)  : _ x 3 x _ -> 3
axis=(1, 2)  : 2 x _ x _ -> 2

結果は以下の通り。

print(b.sum(axis=(0, 1)))
# [60 66 72 78]

print(b.sum(axis=(0, 2)))
# [ 60  92 124]

print(b.sum(axis=(1, 2)))
# [ 66 210]
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事