数学における行列のように数字をまとめて扱いたい場合、プログラミングにおいては配列という概念がある。配列はアナロジー的には数学の行列(1行のみの場合は数列)と全く同じといえる概念である。
- 配列の定義の仕方
- 配列の各要素の取り出し方
- 配列への再代入の仕方
- 配列の型・要素数・次元・各次元のサイズ
- 配列の変形
1. 配列の定義の仕方
配列の定義の仕方は下記のコードの通り。※ 実際にコピペして実行してみることで種々の関数や配列の挙動を確認してみることは重要である。
# コード
import numpy as np
matrix_01_tuple = np.array((1, 2)) # 配列:1行2列の行列というよりは数列という方が近い
matrix_01_list = np.array([1, 2]) # 配列:1行2列の行列というよりは数列という方が近い
matrix_01_list = np.array( ( [1, 2] ) ) # このようにも定義可能ただしmatrix_01_list[0]のようにしか中身を取り出せない
# matrix_01_list[0][0]のように要素を取り出したい場合2行目を定義する必要がある。
matrix_02 = np.array( ( (11, 12), (21, 22) ) ) # dtypeを指定しないと自動で判断してくれる
matrix_02_float = np.array( ( (11, 12), (21, 22) ) ,dtype="float16") # 配列:2行2列の行列
matrix_02_unico = np.array( ( (11, 12), (21, 22) ) ,dtype="U256") # 配列:2行2列の行列
matrix_02_03 = np.array( ( (11, 12, 13), (21, 22, 23) ) ) # 配列:2行3列の行列
matrix_03_02 = np.array( ( (11, 12 ), (21, 22 ), (31, 32 ) ) ) # 配列:3行2列の行列
# 1列目 2列目 3列目 4列目
# Blue,Green,Red Blue,Green,Red Blue,Green,Red Blue,Green,Red
matrix_07_04_3 = np.array( ( ( (128, 64, 128), (128, 128, 128), (128, 128, 128), ( 0, 128, 255) ), # 1行目
( (128, 64, 128), (128, 128, 128), (128, 128, 128), ( 0, 128, 255) ), # 2行目
( (128, 64, 128), (128, 128, 128), (128, 128, 128), ( 0, 128, 255) ), # 3行目
( (128, 64, 128), (128, 128, 128), ( 8, 9, 7), ( 0, 128, 255) ), # 4行目
( (128, 64, 128), (128, 128, 128), (128, 128, 128), ( 0, 128, 255) ), # 5行目
( (128, 64, 128), (128, 128, 128), (128, 128, 128), ( 0, 128, 255) ), # 6行目
( (128, 64, 128), (128, 128, 128), (128, 128, 128), ( 0, 128, 255) ) # 7行目
) # 行列を閉じるための括弧閉じ
) # 配列:1行3列の行列を 要素に持つ 7行4列の行列
print("行列は下記のようにターミナルでは表示される。")
print( matrix_01_tuple )
print( matrix_01_list )
print( matrix_02 )
print( matrix_02_float )
print( matrix_02_unico )
print( matrix_02_03 )
print( matrix_03_02 )
print( matrix_07_04_3 )
2. 配列の各要素の取り出し方
行列のn番目の要素を取り出したい場合には[]を使用して[n-1]を付加して下記のようにコードを書くと、その要素のみを取り出すことができる。
# コード
print("変数への代入も下記のように可能。")
value_sample01 = matrix_01_tuple[0]
print(f"value_sample01={value_sample01}")
print("") # ターミナルの表示を改行するため
print( matrix_01_tuple[0] )
print( matrix_01_list[1] )
print( matrix_02[0][0] )
print( matrix_02_float[0][1] )
print( matrix_02_unico[1][0] )
print( matrix_02_03[1][2] )
print( matrix_03_02[2][1] )
print( matrix_07_04_3[3][2][2] )
3. 配列への再代入の仕方
各要素の番号[n]を付加した配列名に対して、同じ型のものを代入できる。
# コード
print("代入例")
matrix_01_tuple[0] = 100
matrix_02[0][0] = 200
matrix_07_04_3[3][2][2] = 33
print( matrix_01_tuple[0] )
print( matrix_02[0][0] )
print( matrix_07_04_3[3][2][2] )
4. 配列の型・要素数・次元・各次元のサイズ
次元という言葉は聞き慣れないかもしれないが、一般的な言葉の意味と同じである。数学を例にすると、xy平面の要素の表記は(x, y)でこれは2次元であることは理解できるであろう。
# コード
print("配列の型")
print( matrix_01_tuple.dtype )
print( matrix_01_list.dtype )
print( matrix_02.dtype )
print( matrix_02_float.dtype )
print( matrix_02_unico.dtype )
print( matrix_02_03.dtype )
print( matrix_03_02.dtype )
print( matrix_07_04_3.dtype )
print("")
print("配列の要素の型")
print( matrix_01_tuple[0].dtype )
print( matrix_01_list[1].dtype )
print( matrix_02[0][0].dtype )
print( matrix_02_float[0][1].dtype )
print( matrix_02_unico[1][0].dtype )
print( matrix_02_03[1][2].dtype )
print( matrix_03_02[2][1].dtype )
print( matrix_07_04_3[3][2][2].dtype )
print("")
print("配列のサイズ")
print( matrix_01_tuple.size )
print( matrix_01_list.size )
print( matrix_02.size )
print( matrix_02_float.size )
print( matrix_02_unico.size )
print( matrix_02_03.size )
print( matrix_03_02.size )
print( matrix_07_04_3.size )
print("")
print("配列の要素のサイズ")
print( matrix_01_tuple[0].size )
print( matrix_01_list[1].size )
print( matrix_02[0][0].size )
print( matrix_02_float[0][1].size )
print( matrix_02_unico[1][0].size )
print( matrix_02_03[1][2].size )
print( matrix_03_02[2][1].size )
print( matrix_07_04_3[3][2][2].size )
print("")
print("配列の次元")
print( matrix_01_tuple.ndim )
print( matrix_01_list.ndim )
print( matrix_02.ndim )
print( matrix_02_float.ndim )
print( matrix_02_unico.ndim )
print( matrix_02_03.ndim )
print( matrix_03_02.ndim )
print( matrix_07_04_3.ndim )
print("")
print("配列の要素の次元:要素自体はただの変数と同じなので次元を持たいない")
print( matrix_01_tuple[0].ndim )
print( matrix_01_list[1].ndim )
print( matrix_02[0][0].ndim )
print( matrix_02_float[0][1].ndim )
print( matrix_02_unico[1][0].ndim )
print( matrix_02_03[1][2].ndim )
print( matrix_03_02[2][1].ndim )
print( matrix_07_04_3[3][2][2].ndim )
print("")
print("shapeは配列の形を知るためのもの")
print("2次元配列であれば、各行・各列の要素数が分かる")
print( matrix_01_tuple.shape )
print( matrix_01_list.shape )
print( matrix_02.shape )
print( matrix_02_float.shape )
print( matrix_02_unico.shape )
print( matrix_02_03.shape )
print( matrix_03_02.shape )
print( matrix_07_04_3.shape )
print("")
print("shapeは配列の要素はただの変数と同じ")
print( matrix_01_tuple[0].shape )
print( matrix_01_list[1].shape )
print( matrix_02[0][0].shape )
print( matrix_02_float[0][1].shape )
print( matrix_02_unico[1][0].shape )
print( matrix_02_03[1][2].shape )
print( matrix_03_02[2][1].shape )
print( matrix_07_04_3[3][2][2].shape )
5. 配列の変形
flatten()やreshape()を使用するやり方がある。reshape()のほうが汎用性は高いが、flatten()を使用することで配列の形状がわからない場合でも強制的に1行n列の配列に変形できる(nは全要素数)。
# コード
print("flatten関数はその名の通り配列の次元を無視してその要素を順に並べて平坦にする")
print("reshape関数は引数として(n, m)と入れると、n行m列の配列に変形可能\nただし、全要素の総和が n x m と一致しないとエラーとなる")
matrix_02_fl = matrix_02.flatten()
matrix_02_re1 = matrix_02.reshape([matrix_02.size])
matrix_07_04_3_fl = matrix_07_04_3.flatten()
matrix_07_04_3_re1 = matrix_07_04_3.reshape([matrix_07_04_3.size])
matrix_07_04_3_re2 = matrix_07_04_3.reshape([(int)(matrix_07_04_3.size/2), 2])
print(f"matrix_02_fl={matrix_02_fl} ")
print(f"matrix_02_re={matrix_02_re1}")
print(f"matrix_07_04_3_fl=\n {matrix_07_04_3_fl}" )
print(f"matrix_07_04_3_re1=\n{matrix_07_04_3_re1}")
print(f"matrix_07_04_3_re2=\n{matrix_07_04_3_re2}")
EOF