NumPy配列を自在に分割!split, array_split, hsplit, vsplit, dsplit徹底解説


 

NumPyでデータ分析や数値計算を行う際、大きな配列を複数の小さな配列に分割したい場面は頻繁に発生します。NumPyには、この配列分割のための便利な関数がいくつか用意されています。この記事では、np.split, np.array_split, np.hsplit, np.vsplit, **np.dsplit**といった主要な分割関数について、それぞれの特徴と使い方を詳しく解説します。


 

NumPy配列を分割する基本概念

 

NumPy配列の分割は、特定の軸に沿って配列を複数のサブ配列に分解する操作です。これにより、データの特定の部分だけを抜き出して処理したり、並列処理のためにデータを分割したりすることが可能になります。


 

汎用的な分割関数:np.splitnp.array_split

 

 

np.split:正確な分割をしたい場合に

 

np.splitは、配列を等しい要素数または指定したインデックスで分割する際に使用します。等分割できない場合はエラーが発生します。

 

書式

 

Python
 
numpy.split(ary, indices_or_sections, axis=0)
  • ary: 分割したい元の配列。

  • indices_or_sections:

    • 整数: 配列をその数だけ等分割します。

    • 1次元配列(リストやタプル): 分割したいインデックスの配列を指定します。指定されたインデックスの直前で分割されます。

  • axis: 分割する軸(デフォルトは0、つまり行方向)。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.arange(9).reshape(3, 3)
print("元の配列:\n", arr)

# 2つの配列に等分割 (axis=0)
split_arr = np.split(arr, 3, axis=0)
print("\n3つに等分割 (axis=0):\n", split_arr)

# 指定したインデックスで分割 (axis=1)
split_idx_arr = np.split(arr, [1, 2], axis=1)
print("\nインデックス [1, 2] で分割 (axis=1):\n", split_idx_arr)

 

出力例

 

元の配列:
 [[0 1 2]
 [3 4 5]
 [6 7 8]]

3つに等分割 (axis=0):
 [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]

インデックス [1, 2] で分割 (axis=1):
 [array([[0],
       [3],
       [6]]), array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]])]

 

np.array_split:不等分割も可能な柔軟な分割

 

np.array_splitnp.splitと非常によく似ていますが、最大の利点は等分割できない場合でもエラーにならない点です。これは、最後の配列の要素数が他の配列と異なる可能性があることを意味します。

 

書式

 

np.array_splitの書式はnp.splitと同じです。

 

サンプルコード

 

Python
 
import numpy as np

arr = np.arange(7)
print("元の配列:", arr)

# 3つに不等分割
split_arr_uneven = np.array_split(arr, 3)
print("\n3つに不等分割:\n", split_arr_uneven)

 

出力例

 

元の配列: [0 1 2 3 4 5 6]

3つに不等分割:
 [array([0, 1, 2]), array([3, 4]), array([5, 6])]

 

特定の軸に特化した分割関数:np.hsplit, np.vsplit, np.dsplit

 

これらの関数は、それぞれ水平(列)、垂直(行)、深度(3次元配列の場合)方向に特化した分割を行います。内部的にはnp.splitを特定のaxis引数で呼び出しているのと同等です。

 

np.hsplit:水平方向(列)に分割

 

np.hsplitは、配列を**列方向(axis=1)**に分割します。2次元以上の配列にのみ適用できます。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.arange(16).reshape(4, 4)
print("元の配列:\n", arr_2d)

# 2つの配列に水平分割
h_split_arr = np.hsplit(arr_2d, 2)
print("\n水平分割 (hsplit):\n", h_split_arr)

 

出力例

 

元の配列:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

水平分割 (hsplit):
 [array([[ 0,  1],
       [ 4,  5],
       [ 8,  9],
       [12, 13]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11],
       [14, 15]])]

 

np.vsplit:垂直方向(行)に分割

 

np.vsplitは、配列を**行方向(axis=0)**に分割します。2次元以上の配列にのみ適用できます。

 

サンプルコード

 

Python
 
import numpy as np

arr_2d = np.arange(16).reshape(4, 4)
print("元の配列:\n", arr_2d)

# 2つの配列に垂直分割
v_split_arr = np.vsplit(arr_2d, 2)
print("\n垂直分割 (vsplit):\n", v_split_arr)

 

出力例

 

元の配列:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]

垂直分割 (vsplit):
 [array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7]]), array([[ 8,  9, 10, 11],
       [12, 13, 14, 15]])]

 

np.dsplit:深度方向(3次元目)に分割

 

np.dsplitは、配列を**深度方向(axis=2)**に分割します。3次元以上の配列にのみ適用できます。

 

サンプルコード

 

Python
 
import numpy as np

arr_3d = np.arange(2 * 3 * 4).reshape(2, 3, 4)
print("元の配列 (2x3x4):\n", arr_3d)

# 2つの配列に深度分割
d_split_arr = np.dsplit(arr_3d, 2)
print("\n深度分割 (dsplit):\n", d_split_arr)

 

出力例

 

元の配列 (2x3x4):
 [[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

深度分割 (dsplit):
 [array([[[ 0,  1],
        [ 4,  5],
        [ 8,  9]],

       [[12, 13],
        [16, 17],
        [20, 21]]]), array([[[ 2,  3],
        [ 6,  7],
        [10, 11]],

       [[14, 15],
        [18, 19],
        [22, 23]]])]

 

まとめ

 

NumPyの配列分割関数は、データ操作の効率と柔軟性を大幅に向上させます。

  • np.split: 等分割または指定インデックスでの分割に最適。等分割できない場合はエラー。

  • np.array_split: 不等分割も許容し、柔軟な分割が可能。

  • np.hsplit: 列方向(axis=1)の分割専用。

  • np.vsplit: 行方向(axis=0)の分割専用。

  • np.dsplit: 深度方向(axis=2)の分割専用(3次元配列以上)。

これらの関数を適切に使い分けることで、NumPyでのデータ処理がよりスムーズかつ効率的になります。データの前処理、分析、機械学習モデルの準備など、様々な場面でこれらの分割関数が役立つでしょう。