Pythonで一次元配列を二次元配列に変換(numpy.ndarray、リスト)
Pythonで一次元配列を二次元配列に変換する方法について、NumPy配列ndarrayの場合とPython組み込みのリスト(list
型)の場合をそれぞれ説明する。
反対に、多次元配列を一次元に変換(平坦化)する方法については以下の記事を参照。
一次元のNumPy配列ndarrayを二次元に変換
NumPy配列ndarray
の形状を変換するにはreshape()
メソッドを使う。一次元配列から二次元配列への変換に限らず、任意の形状変換が可能。
-1
を使うとその次元のサイズは他の次元から自動的に算出される。
import numpy as np
a = np.arange(6)
print(a)
# [0 1 2 3 4 5]
print(a.reshape(2, 3))
# [[0 1 2]
# [3 4 5]]
print(a.reshape(-1, 3))
# [[0 1 2]
# [3 4 5]]
print(a.reshape(2, -1))
# [[0 1 2]
# [3 4 5]]
source: numpy_1d_to_2d.py
変換できない形状を指定するとエラー。
# print(a.reshape(3, 4))
# ValueError: cannot reshape array of size 6 into shape (3,4)
# print(a.reshape(-1, 4))
# ValueError: cannot reshape array of size 6 into shape (4)
source: numpy_1d_to_2d.py
一次元リストを二次元リストに変換
NumPyを使用する
NumPyを使用できる環境であれば、リストをndarray
に変換してreshape()
で形状を変換してからリストに戻せばよい。
l = [0, 1, 2, 3, 4, 5]
print(np.array(l).reshape(-1, 3).tolist())
# [[0, 1, 2], [3, 4, 5]]
print(np.array(l).reshape(3, -1).tolist())
# [[0, 1], [2, 3], [4, 5]]
source: numpy_1d_to_2d.py
ndarray
とリストの相互変換については以下の記事を参照。
NumPyを使用しない
NumPyを使用しない場合、以下のように、リスト内包表記とrange()
およびスライスを利用する方法が考えられる。
- 関連記事: Pythonリスト内包表記の使い方
- 関連記事: Pythonのrange関数の使い方
- 関連記事: Pythonのスライスによるリストや文字列の部分選択・代入
def convert_1d_to_2d(l, cols):
return [l[i:i + cols] for i in range(0, len(l), cols)]
l = [0, 1, 2, 3, 4, 5]
print(convert_1d_to_2d(l, 2))
# [[0, 1], [2, 3], [4, 5]]
print(convert_1d_to_2d(l, 3))
# [[0, 1, 2], [3, 4, 5]]
print(convert_1d_to_2d(l, 4))
# [[0, 1, 2, 3], [4, 5]]
source: list_1d_to_2d.py
第一引数に元のリスト、第二引数に内側のリストの要素数(= 列数)を指定するようにしている。余りが出る場合は最後の例のように、要素数が異なるリストが格納される。
行数で指定したい場合、簡易的には以下のような関数で実現できる。
def convert_1d_to_2d_rows(l, rows):
return convert_1d_to_2d(l, len(l) // rows)
print(convert_1d_to_2d_rows(l, 2))
# [[0, 1, 2], [3, 4, 5]]
print(convert_1d_to_2d_rows(l, 3))
# [[0, 1], [2, 3], [4, 5]]
print(convert_1d_to_2d_rows(l, 4))
# [[0], [1], [2], [3], [4], [5]]
source: list_1d_to_2d.py
この例はあくまでも簡易的なものなので、割り切れない場合は最後の例のように指定した行数とは異なる結果となる。余りを考慮したりはしない。