配列を複数の部分に分けたいとき、split、vsplit、hsplit を使います。結合の vstack、hstack と対になる操作です。
split:指定した位置で分割
np.split() は、配列を指定した位置または個数で分割します。
import numpy as np a = np.arange(10) print(a) # [0 1 2 3 4 5 6 7 8 9] # 3等分 parts = np.split(a, 3) # エラー!10は3で割り切れない
等分する場合は、配列の要素数が分割数で割り切れる必要があります。
a = np.arange(9) # 3等分 parts = np.split(a, 3) print(parts) # [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
インデックスのリストを渡すと、その位置で分割されます。
a = np.arange(10) # インデックス3と7で分割 parts = np.split(a, [3, 7]) print(parts) # [array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]
この方法なら、不均等な分割も可能です。
array_split:等分できなくてもOK
np.array_split() は、割り切れなくても分割できます。要素数が均等にならない場合、前のほうの部分配列が1つ多くなります。
a = np.arange(10) # 3分割(割り切れない) parts = np.array_split(a, 3) print(parts) # [array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8, 9])]
vsplit:縦方向に分割
np.vsplit() は、2次元配列を縦方向(行方向)に分割します。
a = np.arange(12).reshape(4, 3) print(a) # [[ 0 1 2] # [ 3 4 5] # [ 6 7 8] # [ 9 10 11]] # 2つに分割(2行ずつ) top, bottom = np.vsplit(a, 2) print(top) # [[0 1 2] # [3 4 5]] print(bottom) # [[ 6 7 8] # [ 9 10 11]]
hsplit:横方向に分割
np.hsplit() は、2次元配列を横方向(列方向)に分割します。
a = np.arange(12).reshape(3, 4) print(a) # [[ 0 1 2 3] # [ 4 5 6 7] # [ 8 9 10 11]] # 2つに分割(2列ずつ) left, right = np.hsplit(a, 2) print(left) # [[0 1] # [4 5] # [8 9]] print(right) # [[ 2 3] # [ 6 7] # [10 11]]
使い分けの目安
| 関数 | 分割方向 | 特徴 |
|---|---|---|
| split | axis で指定 | 等分のみ(割り切れないとエラー) |
| array_split | axis で指定 | 不均等な分割も可能 |
| vsplit | 縦(行方向) | 行を分ける |
| hsplit | 横(列方向) | 列を分ける |
等分できるか不明な場合は array_split を使うと安全です。2次元配列を直感的に分けたいなら、vsplit や hsplit が便利でしょう。