Pythonのリストとは違って、NumPyの配列には軸(axis)という概念があります。そして、この軸の概念を活用すると、行列の行ごとの演算や列ごとの演算を楽に行えるようになります。ここでは、この点について解説します。
当ページで学ぶこと
- NumPyの配列における行や軸の概念について
- 配列の行や列ごとの演算を行う方法
NumPy配列の行と列
NumPy配列の軸の話に入る前に、NumPy配列の知識についておさらいしましょう。
通常 Python では、私たちは数値のリストを扱います。たとえば、3 つずつ 2 行の要素がある 2 次元行列を、リストでは以下のように定義することができます。
list = [[1,2,3],[4,5,6]]
print(list)
これは単なる数値のリストであって、線形代数で扱うベクトルや行列のように行や列という概念はありません。
一方で NumPy の配列には行や列という概念があります。以下は、上のリストを array()
関数で Numpy 配列に変換したものですが、出力結果を見ると、明らかに行列という概念に変化している(行と列という属性をもつデータに変化している)ことがわかると思います。
import numpy as np
arr = np.array(list)
print(arr)
このことは NumPy の配列には Python のリストにはない、行数と列数を格納した shape
属性が存在するということからもわかります。
print(arr.shape)
NumPy の配列データを行単位・列単位で演算
機械学習では NumPy の配列を行ごとや列ごとに計算することが必要なときが多々あります。たとえば、行ごとや列ごとに、行列の要素の合計値や平均値を求める場合などです。
合計値や平均値は sum()
関数や mean()
関数で求められるのですが、これらの関数を使うときに、引数で “axis” を指定することで、任意の行や列の要素だけを計算に含めることができます。
具体的には列の要素ごとの演算をしたい場合は axis=0
を、行の要素ごとの演算をしたい場合は axis=1
を指定します。もちろんデフォルトの axis=None
では、行列のそれぞれの要素単位での演算になります。
実際にコードを見ていきましょう。
デフォルト(axis=None) で行列単位の演算
NumPy でさまざまな演算を行うとき、デフォルトの axis=None
の設定では、その演算は行列単位で行われます。以下の配列を例に見てみましょう。
import numpy as np
data=np.array([
[1,2],
[3,4]])
print(data)
たとえば、この行列の要素の合計値を求めるには、sum()
メソッドを使います。
# 行ごとの合計を求める
s = data.sum()
print(s)
続いて、この行列の要素の平均値を求めるには、mean()
メソッドを使います。
# 行ごとの平均を求める
m = data.mean()
print(m)
axis=0 で列単位の演算
NumPy で演算を行うときに axis=0
と設定すると、その演算は列の要素ごとに行われます。以下の配列を例に見てみましょう。
import numpy as np
data=np.array([
[1,2,3],
[4,5,6]])
print(data)
この配列の列ごとの合計を求めるには、sum()
メソッドの引数で axis=0
と設定します。
# 列ごとの合計を求める
s = data.sum(axis=0)
print(s)
他にも、この配列の列ごとの合計を求めるには、mean()
メソッドの引数で axis=0
と設定します。
# 列ごとの平均を求める
m = data.mean(axis=0)
print(m)
axis=1 で行単位の演算
NumPy で演算を行うときに axis=0
1設定すると、その演算は行の要素ごとに行われます。以下の配列を例に見てみましょう。
import numpy as np
data=np.array([
[1,2],
[3,4],
[5,6]])
print(data)
この配列の行ごとの合計を求めるには、sum()
メソッドの引数で axis=
1 と設定します。
# 行ごとの合計を求める
s = data.sum(axis=1)
print(s)
他にも、この配列の行ごとの合計を求めるには、mean()
メソッドの引数で axis=1
と設定します。
# 行ごとの平均を求める
m = data.mean(axis=1)
print(m)
一緒に読んでおきたいページ