note.nkmk.me

Pythonで一次元配列を二次元配列に変換(numpy.ndarray、リスト)

Date: 2019-07-28 / tags: Python, NumPy, リスト

Pythonで一次元配列を二次元配列に変換する方法について、NumPy配列ndarrayの場合とPython組み込みのリスト(list型)の場合をそれぞれ説明する。

  • 一次元のNumPy配列ndarrayを二次元に変換
  • 一次元リストを二次元リストに変換
    • NumPyを使用する
    • NumPyを使用しない

反対に、多次元配列を一次元に変換(平坦化)する方法については以下の記事を参照。

スポンサーリンク

一次元の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]]

変換できない形状を指定するとエラー。

# 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)

一次元リストを二次元リストに変換

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]]

ndarrayとリストの相互変換については以下の記事を参照。

NumPyを使用しない

NumPyを使用しない場合、以下のように、リスト内包表記とrange()およびスライスを利用する方法が考えられる。

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]]

第一引数に元のリスト、第二引数に内側のリストの要素数(= 列数)を指定するようにしている。余りが出る場合は最後の例のように、要素数が異なるリストが格納される。

行数で指定したい場合、簡易的には以下のような関数で実現できる。

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]]

この例はあくまでも簡易的なものなので、割り切れない場合は最後の例のように指定した行数とは異なる結果となる。余りを考慮したりはしない。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事