#転置行列
行列転置の方法を備忘録しておく。
test.py
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
I = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
#転置行列
AT = list(zip(*A))
#[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
IT = list(zip(*I))
#[(1, 0, 0), (0, 1, 0), (0, 0, 1)]
以下は処理内容についてわからなければどうぞ。
#謎のアスタリスク(スター)*
print文内の*(アスタリスク、スター)は積ではなく展開を意味しており、たとえばさっきのAに対して
test.py
A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(A)
#[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(*A)
#[1, 2, 3] [4, 5, 6] [7, 8, 9]
というふうにリスト等の中身をばらそうねという指示になる。
Aが「2次元行列を1つ渡した」のであれば*Aは「1次元配列を3つ渡した」ということになろう。
ところで物理界隈では"*"をスターと呼んでたけど情報屋さんは何と呼ぶのがメジャーなんだろう。
#zip()
zip()関数は与えられた複数のリストやタプルをそれぞれインデックスごとに組み合わせし直してタプルで返してくる。
python.test.py
name = ("hoge", "hogege", "hogee")
yo = (20, 30, 40)
location = ("hiroshima", "fuchu", "abashiri")
data = list(zip(name, yo, location))
for i in range(len(name)):
print(data[i])
#('hoge', 20, 'hiroshima')
#('hogege', 30, 'fuchu')
#('hogee', 40, 'abashiri')
そんなわけでlist(zip(*A))でAを転置できているのだ。