NumPy:配列を分割する(split, vsplit, hsplit)

配列を複数の部分に分けたいとき、splitvsplithsplit を使います。結合の vstackhstack と対になる操作です。

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

使い分けの目安

関数分割方向特徴
splitaxis で指定等分のみ(割り切れないとエラー)
array_splitaxis で指定不均等な分割も可能
vsplit縦(行方向)行を分ける
hsplit横(列方向)列を分ける

等分できるか不明な場合は array_split を使うと安全です。2次元配列を直感的に分けたいなら、vsplithsplit が便利でしょう。