##転置行列とは
線形代数で行列の転置行列を求めることがあります。勉強のためpythonのリストを使い計算してみます。自分の復習のため転置行列についてまとめます。
X =
\begin{bmatrix}
11 & 12 & 13 & 14\\
21 & 22 & 23 & 24\\
31 & 32 & 33 & 34 \\
\end{bmatrix}
とした場合、転置行列は次のとおりです。
X^{\mathrm{T}}=
\begin{bmatrix}
11 & 21 & 31\\
12 & 22 & 32 \\
13 & 23 & 33 \\
14 & 24 & 34 \\
\end{bmatrix}
要は、行の要素を列の要素に置き換えるわけです。
##リストを使った行列の考え方
Pythonでは行列は次のように2次元リストで表現することができます。つまり行単位にリストを作成し、そのリストをさらに外枠のリストに入れ込むわけです。
matrix = [
[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34]
]
このため転置行列を求めるためには、1行目のリストから最後の行のリストまでの各行につき0番目(1列目)の要素を取り出してリストを作成し、次に1番目(2列目)、2番目(3列目)、3番目(4列目)と繰り返します。最後に、それぞれのリストをさらに外枠のリストに入れ込めばよいわけです。
##2次元リストの処理
そこで、まず2次元リストの基本的な処理をまとめてみます。2次元リストの中の行(ここではvextorとします)を取り出すには、通常のfor文で回すだけです。
"""
行列(二次元リスト)から要素(行)を取り出す
"""
matrix = [
[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34]
]
for vector in matrix:
print (vector)
このように、あっけなくできてしまいます。
[11, 12, 13, 14] [21, 22, 23, 24] [31, 32, 33, 34]
次に、ここで取り出した0番目(1行目)のリスト:vector_1([11, 12, 13, 14])に対し、0番目(1列目)の要素を取り出すために、[ ]を使います。
"""
行列の0番目(1列目)の要素を取り出す
"""
vector_1 = [11, 12, 13, 14]
print(vector_1[0])
結果は11になります。
そして、転置行列を計算するためには、行列:matrixの0番目(1列目)からはじまり各列について、各行のその列にあてはまる要素を取り出してリストを作ればよいことになります。したがって、転置行列の初めの行を求めるプログラムは次のとおりになります。
"""
行列(2次元リスト)から各行の初めの要素を取り出してリストにする
"""
matrix = [
[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34]
]
tr=[]
for vector in matrix:
tr.append (vector[0])
print(tr)
結果は次のとおりです。
[11, 21, 31]
##転置行列の作成
この例の場合には、元の行列(matrix)は4つの列があるので、program3のvector[0]を変数に置き換えた上で、for文を4回繰り返し、それぞれ求めたリストをさらに外枠の2次元リストに組み込めば完成です。
"""
for文で転置行列を作成する
"""
matrix = [
[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34]
]
tr = []
for i in range(4):
tr_row = []
for vector in matrix:
tr_row.append(vector[i])
tr.append(tr_row)
print(tr)
結果は次のとおりです。
[[11, 21, 31], [12, 22, 32], [13, 23, 33], [14, 24, 34]]
上手くできました。
##NumPyを使い転置行列を作成する
もっとも、pythonのパッケージNumPyには、転置行列を計算するtメソッドがあります。
"""
NumPyを使い転置行列を作成する
"""
import numpy as np
matrix = [
[11, 12, 13, 14],
[21, 22, 23, 24],
[31, 32, 33, 34]
]
matrix_n = np.array(matrix)
tr = matrix_n.T
print(tr)
結果は次のとおりです。
[[11 21 31]
[12 22 32]
[13 23 33]
[14 24 34]]
でも、これではリスト操作の勉強にはなりません。今度はリスト内包表記なども使ってやってみたいと思います。