どうも!リョクちゃです。
久々の更新になります……。すみません。
今回はタイトル通り、Numpyを使わずに行列を生成し、
足し算をさせてみたので紹介していきます。
Numpyは数値計算ライブラリの一種で主に配列の処理に特化したライブラリになります。
配列は、複数のデータを持ち、Pythonではリスト、タプルや集合で表現されます。
リストやタプルは中にリストやタプルを入れること(ネストさせる)で多次元配列を
表現することも可能です。(ここが大事です。)
ちなみに前回の記事はこちら
目次
行列演算
まず行列では、
横方向に並んでいるものを“行” (下図赤枠で囲んだもの)
縦方向に並んでいるものを“列” (下図青枠で囲んだもの)
として表現されます。
図の場合の行列を2行2列と呼びます。
Pythonで行列を表現
これをPythonで表現する場合は、リスト型で表現することができます。
以下のような形になります。
1 |
lstQueue = [[a, b], [c, d]] |
このようにリストの中にリストを入れることで行列を表現できます。
※a~dには、数値が入ります。
こちらに関しては、以下の記事でも紹介しています。
行列の足し算や引き算は、同じ行と列の数であることが条件になります。
この数が同じでない場合、足し算はできません。
行列における足し算は、以下のような形式で行われます。
行列Aと行列Bがあります。
上記のようにして、行列Aと行列Bの足し算ができます。
※同じ行数と列数の行列に限ります。
これをPythonで行おうとすると、様々な書き方がありますが、
シンプルに書くと、
例) 行列A = [[3, -7], [6, -4]], 行列B = [[0, 3], [4, -4]]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
lstA = [[3, 7], [6, -4]] lstB = [[0, 3], [4, -4]] elem = 0 for a in lstA: # ……① lstTemp = [] # ……② elem_a = 0 for a_1 in a: # ……③ print(lstB[elem][elem_a ] + a_1) # ……④ lstTemp.append(lstB[elem][elem_a ] + a_1) # ……⑤ elem_a += 1 lstC.append(lstTemp) # ……⑥ elem += 1 |
for文を使って表すことができます。
① for文で、lstAの1行目からループをさせています。
変数aには、[3, 7]が入ります。
② ①のforの後に、計算結果を一時的に格納しておく変数lstTempを作成
カウンタ用に変数elem_aを作成します。
※カウンタ変数は処理の順番を把握するように用意しています。
③ for文では、変数aの中身についてループをさせています。
変数a_1には3が入ります。
④ 各成分同士の計算結果は都度print関数で出力しています。
⑤ forの後は、lstBの同じ成分をlstAの1行1列目の値(3)と足し算しています。
計算結果はlstTempに格納しています。
⑥ 行ごとの計算をlstCに追加しています。
ちょっと凝ってみたのも下に載せておきます。
1 2 3 4 5 6 |
enumerate関数を使って for i, a in enumerate(lstA): lstTemp = [] for j, a_1 in enumerate(a): lstTemp.append(lstB[i][j] + a_1) lstC.append(lstTemp) |
これはenumerate関数を使って、
要素のインデックスを取得しながら行列の足し算をさせています。
enumerate関数は、返り値に引数で渡した要素のインデックスと値を返してくれます。
引数には、リスト型の変数を渡す使い方が多く散見されます。
基本的には配列なので、リスト以外での利用はもちろんできます。
まとめ
Numpyを使わずに行列を作って足し算をさせるといった紹介をしていきました。
行列の足し算は、同じ行数と列数であることが条件になります。
その後、同じ成分同士を足し合わせることで行列の足し算が行えます。
これはのちに解説するであろう行列の引き算でも同じです。
Pythonで行列を生成するには、リストの中にリストを入れることで生成できます。
ライブラリを使わないでコードを書いてみるのも理解につながって楽しいと思います。
最後までお読みいただきありがとうございます。
・こちらの書籍を参考にPythonの理解を深めています。