経緯
深層学習の本を読み進めていこうと思っているのですが、ひたすら文字を読んでると眠くなってしまうので、出てきた項目をpythonで実装しながら理解を深めていこうと思います。需要があるかはわかりませんが、シリーズ化していこうと思います(笑)。今回は転置です。最近、c++とcばかりでpythonを忘れてきているので、復習も兼ねてpythonで実装していこうと思います。
追記: 一応シリーズ化してみました(笑)。目次はこちら。
転置
本の定義(24ページ)では、左上の角から始まって右下までの主対角線と呼ばれる行列の対角線に対する鏡像であると言っています。詳しくはこちらをどうぞ。
実装
簡単な方法はnumpyを使った方法があります。こちらを参考にしました。
import numpy
def main():
l_2d = [[0, 1, 2], [3, 4, 5]]
arr_t = np.array(l_2d).T.tolist()
print(l_2d)
# [[0 3]
# [1 4]
# [2 5]]
追記: @shiracamusさんからコメント頂いた、他の転置の方法はこちら
>>> l_2d = [[0, 1, 2], [3, 4, 5]]
>>> [*zip(*l_2d)]
[(0, 3), (1, 4), (2, 5)]
>>> list(map(list, zip(*l_2d)))
[[0, 3], [1, 4], [2, 5]]
>>> [[*row] for row in zip(*l_2d)]
[[0, 3], [1, 4], [2, 5]]
>>> [list(row) for row in zip(*l_2d)]
[[0, 3], [1, 4], [2, 5]]
上記のような方法を使えば瞬殺ですが、自作してみます。考え方としては、まず配列に入っている各配列の要素(上の例だと0と3)を1つの配列にして、新しい2次元配列の最初の要素として追加します。これを1と4、2と5でも同じことをやるようなイメージで今回はやってみました。さっき思いついたまま実装しただけなので、もっと良い方法があれば教えてください。実装はこんな感じです。
def transpose(arr):
col = len(arr[0]) # この場合は3
row = len(arr) # この場合は2
ans_list = []
i = 0
while i < col:
tmp_list = []
j = 0
while j < row:
tmp_list.append(arr[j][i])
j += 1
ans_list.append(tmp_list)
i += 1
return ans_list
def main():
l_2d = [[0, 1, 2], [3, 4, 5]]
print(transpose(l_2d))
# [[0 3]
# [1 4]
# [2 5]]
追記: @shiracamusさんからコメント頂いた、for文でのやり方はこちら
def transpose(arr):
col = len(arr[0]) # この場合は3
row = len(arr) # この場合は2
rows = []
for c in range(col):
cols = []
for r in range(row):
cols.append(arr[r][c])
rows.append(cols)
return rows
まとめ
こんな感じでゆる~く深層学習の本を読み進めていこうと思います。
間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。