NumPy:配列を分割する(split, vsplit, hsplit)
配列を複数の部分に分けたいとき、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 が便利でしょう。