Pythonリスト型の二次元配列の行と列を入れ替える(転置)
Python標準のリスト型listではリストのリストによって2次元配列を表現できる。
この2次元配列の行と列を入れ替える(転置、transposeする)方法を説明する。
NumPyやpandasを使ったほうが楽だが、転置するためだけにNumPyやpandasをimportしたくない場合(その後NumPyやpandasで処理しない場合)はzip()関数を使った方法で転置できる。
元の二次元配列を以下のように定義する。
import numpy as np
import pandas as pd
l_2d = [[0, 1, 2], [3, 4, 5]]
NumPy配列ndarrayに変換し.Tで転置
元の二次元配列からNumPy配列ndarrayを生成し、.T属性で転置したオブジェクトを取得する。
最終的にPythonのリスト型listのオブジェクトが欲しい場合は、さらにtolist()メソッドでlistに変換する。
arr_t = np.array(l_2d).T
print(arr_t)
print(type(arr_t))
# [[0 3]
# [1 4]
# [2 5]]
# <class 'numpy.ndarray'>
l_2d_t = np.array(l_2d).T.tolist()
print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>
.T属性のほかにも、ndarrayのメソッドtranspose()や関数numpy.transpose()を使う方法もある。三次元以上の多次元配列に対する処理など、詳細は以下の記事を参照。
pandas.DataFrameに変換し.Tで転置
元の二次元配列からpandas.DataFrameを生成し、.T属性で転置したオブジェクトを取得する。
最終的にPythonのリスト型listのオブジェクトが欲しい場合は、values属性でnumpy.ndarrayを取得、さらにtolist()メソッドでlistに変換する。
df_t = pd.DataFrame(l_2d).T
print(df_t)
print(type(df_t))
# 0 1
# 0 0 3
# 1 1 4
# 2 2 5
# <class 'pandas.core.frame.DataFrame'>
l_2d_t = pd.DataFrame(l_2d).T.values.tolist()
print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>
組み込み関数zip()で転置
組み込み関数zip()を利用して二次元配列を転置する。
zip()は複数のイテラブル(リストやタプルなど)の要素をまとめたイテレータを返す関数。複数のリストをforループで回すときなどに使う。
さらに、関数の引数に*をつけるとリストを展開して渡せるという仕組みを使う。
以下のように転置ができる。
l_2d_t_tuple = list(zip(*l_2d))
print(l_2d_t_tuple)
print(type(l_2d_t_tuple))
# [(0, 3), (1, 4), (2, 5)]
# <class 'list'>
print(l_2d_t_tuple[0])
print(type(l_2d_t_tuple[0]))
# (0, 3)
# <class 'tuple'>
このままだと中の要素がタプルになるため、リストにしたい場合はリスト内包表記でタプルをリストに変換するlist()を使う。
l_2d_t = [list(x) for x in zip(*l_2d)]
print(l_2d_t)
print(type(l_2d_t))
# [[0, 3], [1, 4], [2, 5]]
# <class 'list'>
print(l_2d_t[0])
print(type(l_2d_t[0]))
# [0, 3]
# <class 'list'>
順を追って分解して書くと以下のようになっている。
*でリストの要素が展開され、展開した要素がzip()関数でまとめられ、さらに、リスト内包表記でタプルがリストに変換される。
print(*l_2d)
# [0, 1, 2] [3, 4, 5]
print(list(zip([0, 1, 2], [3, 4, 5])))
# [(0, 3), (1, 4), (2, 5)]
print([list(x) for x in [(0, 3), (1, 4), (2, 5)]])
# [[0, 3], [1, 4], [2, 5]]