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

Modified: | Tags: Python, NumPy

NumPy配列ndarrayの合計や平均、最大値・最小値を求めるには、それぞれ、np.sum(), np.mean(), np.max(), np.min()を使う。

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

また、これらの関数はndarrayのメソッドとしても提供されている。

本記事では主に二次元配列を対象とする。三次元以上の多次元配列における引数axisや引数keepdimsについての詳細は以下の記事を参照。

欠損値NaNを含むndarrayに対する合計や平均などの算出については以下の記事を参照。

本記事のサンプルコードのNumPyのバージョンは以下の通り。バージョンによって仕様が異なる可能性があるので注意。

import numpy as np

print(np.__version__)
# 1.26.1

numpy.sum(): 合計

配列ndarrayの合計を算出するにはnp.sum()を使う。

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

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.sum(a))
# 66

引数axis=0とすると列ごとの合計値、axis=1とすると行ごとの合計値が返される。

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

print(np.sum(a, axis=1))
# [ 6 22 38]

axisは負の値で後ろから指定することも可能。二次元配列の場合、axis=-1axis=1axis=-2axis=0と同じ。

print(np.sum(a, axis=-1))
# [ 6 22 38]

print(np.sum(a, axis=-2))
# [12 15 18 21]

存在しない軸を指定するとエラーになる。

# print(np.sum(a, axis=2))
# AxisError: axis 2 is out of bounds for array of dimension 2

# print(np.sum(a, axis=-3))
# AxisError: axis -3 is out of bounds for array of dimension 2

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

print(a.sum())
# 66

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

print(a.sum(axis=1))
# [ 6 22 38]

numpy.mean(): 平均

配列ndarrayの平均を算出するにはnp.mean()を使う。

np.sum()と同様、デフォルトは配列全体の平均値、引数axisを指定すると、列ごと・行ごとの平均値が返される。

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.mean(a))
# 5.5

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

print(np.mean(a, axis=1))
# [1.5 5.5 9.5]

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

print(a.mean())
# 5.5

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

print(a.mean(axis=1))
# [1.5 5.5 9.5]

numpy.max(), min(): 最大値、最小値

配列ndarrayの最大値・最小値を算出するにはnp.max(), np.min()を使う。

np.sum()と同様、デフォルトは配列全体の最大値・最小値、引数axisを指定すると、列ごと・行ごとの最大値・最小値が返される。

a = np.arange(12).reshape(3, 4)
print(a)
# [[ 0  1  2  3]
#  [ 4  5  6  7]
#  [ 8  9 10 11]]

print(np.max(a))
# 11

print(np.max(a, axis=0))
# [ 8  9 10 11]

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

print(np.min(a))
# 0

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

print(np.min(a, axis=1))
# [0 4 8]

np.max()np.min()のエイリアスとしてnp.amax()np.amin()も定義されている。例は省略するが、使い方は同じ。

max(), min()ndarrayのメソッドとして呼び出すことができる。

print(a.max())
# 11

print(a.max(axis=0))
# [ 8  9 10 11]

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

print(a.min())
# 0

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

print(a.min(axis=1))
# [0 4 8]

最小値や最大値のインデックス(位置)を取得したい場合はnp.argmin(), np.argmax()を使う。以下の記事を参照。

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

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

そのほかの関数やndarrayのメソッドについては公式ドキュメントを参照。

関連カテゴリー

関連記事