[NumPy] 配列の次元数と軸

[NumPy] 配列の次元数と軸

配列の次元数と軸

配列の次元数

 NumPy の配列 ndarray を生成するときに [] で括った数が、その配列の次元数となることを説明しました。ここであらためて、NumPy における配列の次元数が何を意味するのか、図を使って直感的に説明しておきます。

 まず最初に 1 次元配列について考えます。たとえば、5 個の要素をもつ配列を作成したとします。これは 0 ~ 4 のインデックス番号が割り当てられた箱のそれぞれに要素が 1 個ずつ入っているということです。今、この 1 次元配列をまとめて1つの大きな箱とみなして、青色に塗ることにします。

 Python NumPy 配列の次元2

 同様に、同じ要素数をもつ別の 1 次元配列をいくつかもってきて、他と区別できるように別々の色で塗ることにします。1 次元配列は何個用意してもいいのですが、とりあえず全部で 3 個揃えることにします。そして下図のように縦に並べます。

 Python NumPy 配列の次元3

 このようにして 5 × 3 の 2 次元配列が生成されます。青、赤、黄色の箱にあらためて 0, 1, 2 というインデックス番号を割り当てると、すべての要素を 2 つの番号で参照することができます。たとえば赤の 3 番目の要素は [1, 3] で参照できます。

 Python NumPy 多次元配列

 それでは実際に 5 × 3 の配列をつくって次元数を表示させてみましょう。

# サンプルコードA

# NumPyをインポート
import numpy as np

box_blue = [2, 3, 5, 7, 11]
box_red = [13, 17, 19, 23, 29]
box_yellow = [31, 37, 41, 43, 47]

# 2次元配列を作成
x = np.array([box_blue, box_red, box_yellow])

print(x)
[[ 2  3  5  7 11
 [13 17 19 23 29]
 [31 37 41 43 47]]

 
 2行目4列目の要素を参照してみます。

# サンプルコードA-1

# 2行目の4列目の要素を取得
print(x[1, 3])
23

 
 配列のデータ属性 (インスタンス変数) ndim にアクセスして次元数を取得します。

# サンプルコード A-2

# 配列の次元数を取得
print(x.ndim)
2

 
 [[10, 20, 30]] も [] で 2 重に括られているので 2 次元配列として扱われます。

# NumPyをインポート
import numpy as np

x = np.array([[10, 20, 30]])

print(x)
print("次元数", x.ndim)
[[10 20 30]]
次元数 2

 これは下図のように、2 次元の箱に 1 次元配列が 1 個入っていることを意味しています。

 Python Numpy 2次元配列③
 

配列の軸

 NumPy には axis という引数を受け取る関数が数多く存在します。axis とは「座標軸」のことですが、NumPy では配列の軸を意味します。配列の縦軸は axis = 0, 横軸は axis = 1 です。さきほどつくった配列で確認してみましょう。サンプルコード A を再掲しておきます。

# サンプルコードA

# NumPyをインポート
import numpy as np

box_blue = [2, 3, 5, 7, 11]
box_red = [13, 17, 19, 23, 29]
box_yellow = [31, 37, 41, 43, 47]

# 2次元配列を作成
x = np.array([box_blue, box_red, box_yellow])

print(x)
[[ 2  3  5  7 11
 [13 17 19 23 29]
 [31 37 41 43 47]]

 
 たとえば、要素の和を計算する numpy.sum() の axis に 0 を渡すと、各次元の要素を縦方向に合計して 1 次元配列を生成します。

# サンプルコード A-3

# 各次元の要素を縦方向に足し合わせる
s = np.sum(x, axis = 0)

print(s)
[46 57 65 73 87]

 
 axis に 1 を渡すと横方向に合計して 1 次元配列を生成します。

# サンプルコード A-4

# 各次元の要素を横方向に足し合わせる
s = np.sum(x, axis = 1)

print(s)
[28 101 199]

 
 縦軸 (axis = 0) と横軸 (axis = 1) に並んでいる要素数は、ndarrayオブジェクトの shape というデータ属性に記録されています。

# サンプルコード A-5

# 行方向と列方向の要素の数を取得
print(x.shape)
(3, 5)

 

要素のサイズ

 配列に含まれる全要素の数は ndarray.size() で取得できます。

# サンプルコード A-6

# 配列の全要素数を取得
print(x.size)
15