0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

Python数学シリーズ① 転置

経緯

深層学習の本を読み進めていこうと思っているのですが、ひたすら文字を読んでると眠くなってしまうので、出てきた項目をpythonで実装しながら理解を深めていこうと思います。需要があるかはわかりませんが、シリーズ化していこうと思います(笑)。今回は転置です。最近、c++とcばかりでpythonを忘れてきているので、復習も兼ねてpythonで実装していこうと思います。
追記: 一応シリーズ化してみました(笑)。目次はこちら

転置

本の定義(24ページ)では、左上の角から始まって右下までの主対角線と呼ばれる行列の対角線に対する鏡像であると言っています。詳しくはこちらをどうぞ。

実装

簡単な方法はnumpyを使った方法があります。こちらを参考にしました。

main.py
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でも同じことをやるようなイメージで今回はやってみました。さっき思いついたまま実装しただけなので、もっと良い方法があれば教えてください。実装はこんな感じです。

main.py
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

まとめ

こんな感じでゆる~く深層学習の本を読み進めていこうと思います。

間違いや質問、ご意見等ありましたらお気軽にコメントください。頑張って答えますので(笑)。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?