NumPy

【NumPy】配列(ndarray)の分割方法 ~ split, vsplit, hsplit ~

【NumPy】配列(ndarray)の分割方法 _ split, vsplit, hsplit _

NumPyの配列(ndarray)の分割方法について解説します。

行方向(垂直方向)の分割

NumPyの配列(ndarray)を行方向(垂直方向)に分割する場合には、split関数またはvsplit関数を使用します。分割の方法には、指定個数に分割する方法と指定位置で分割する方法があります。以降では、それぞれの方法ついて見ていきます。

指定個数で分割する方法

splitを使用した分割

split関数を使用して指定個数で分割する場合は、以下の例のように使用します。分割したい配列と分割個数を指定し実行します。

import numpy as np

x = np.arange(36).reshape((6, 6))
print(f'x: \n{x}\n')

# 配列を行方向(垂直方向)に指定個数で分割する (split)
x_split = np.split(x, 3)

for i, x in enumerate(x_split):
    print(f'x_split[{i}]: \n{x}')
【実行結果】
x: 
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]

x_split[0]: 
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
x_split[1]: 
[[12 13 14 15 16 17]
 [18 19 20 21 22 23]]
x_split[2]: 
[[24 25 26 27 28 29]
 [30 31 32 33 34 35]]

結果は配列(ndarray)のリストとして取得できます。

注意点として、分割する数は分割する方向の長さを割り切れる数である必要があります。例えば、6行の配列を4分割しようとするとValueErrorとなります。

vsplitを使用した分割

vsplit関数を使用して指定個数で分割する場合は、以下の例のように使用します。分割したい配列と分割個数を指定し実行します。

import numpy as np

x = np.arange(36).reshape((6, 6))
print(f'x: \n{x}\n')

# 配列を行方向(垂直方向)に指定個数で分割する (vsplit)
x_split = np.vsplit(x, 3)

for i, x in enumerate(x_split):
    print(f'x_split[{i}]: \n{x}')
【実行結果】
x: 
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]

x_split[0]: 
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]]
x_split[1]: 
[[12 13 14 15 16 17]
 [18 19 20 21 22 23]]
x_split[2]: 
[[24 25 26 27 28 29]
 [30 31 32 33 34 35]]

結果は配列(ndarray)のリストとして取得できます。

注意点として、分割する数は分割する方向の長さを割り切れる数である必要があります。例えば、6行の配列を4分割しようとするとValueErrorとなります。

指定位置で分割する方法

splitを使用した分割

split関数を使用して指定位置で分割する場合は、以下の例のように使用します。分割したい配列と分割位置リストを指定し実行します。

import numpy as np

x = np.arange(25).reshape((5, 5))
print(f'x: \n{x}\n')

# 配列を行方向(垂直方向)に指定位置で分割する (split)
x_split = np.split(x, [2, 4])

for i, x in enumerate(x_split):
    print(f'x_split[{i}]: \n{x}')
【実行結果】
x: 
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

x_split[0]: 
[[0 1 2 3 4]
 [5 6 7 8 9]]
x_split[1]: 
[[10 11 12 13 14]
 [15 16 17 18 19]]
x_split[2]: 
[[20 21 22 23 24]]

結果は配列(ndarray)のリストとして取得できます。

上記の例では、複数位置を指定していますが、例えばインデックス2の位置で2分割にしたいような場合には、[2]というように一要素を含むリストを指定すれば実行できます。

vsplitを使用した分割

vsplit関数を使用して指定位置で分割する場合は、以下の例のように使用します。分割したい配列と分割位置リストを指定し実行します。

import numpy as np

x = np.arange(25).reshape((5, 5))
print(f'x: \n{x}\n')

# 配列を行方向(垂直方向)に指定位置で分割する (vsplit)
x_split = np.vsplit(x, [2, 4])

for i, x in enumerate(x_split):
    print(f'x_split[{i}]: \n{x}')
【実行結果】
x: 
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

x_split[0]: 
[[0 1 2 3 4]
 [5 6 7 8 9]]
x_split[1]: 
[[10 11 12 13 14]
 [15 16 17 18 19]]
x_split[2]: 
[[20 21 22 23 24]]

結果は配列(ndarray)のリストとして取得できます。

上記の例では、複数位置を指定していますが、例えばインデックス2の位置で2分割にしたいような場合には、[2]というように一要素を含むリストを指定すれば実行できます。

列方向(水平方向)の分割

NumPyの配列(ndarray)を列方向(水平方向)に分割する場合には、split関数またはhsplit関数を使用します。分割の方法には、指定個数に分割する方法と指定位置で分割する方法があります。それぞれについて見ていきます。

指定個数で分割する方法

splitを使用した分割

split関数を使用して指定個数で分割する場合は、以下の例のように使用します。分割したい配列と分割個数を指定し実行します。

行方向(垂直方向)の分割との違いは、「axis=1」を指定して列方向の軸を指定している点です。行方向の場合は特に指定しませんでしたが、デフォルトでaxis=0が指定されています。

import numpy as np

x = np.arange(36).reshape((6, 6))
print(f'x: \n{x}\n')

# 配列を列方向(水平方向)に指定個数で分割する (split)
x_split = np.split(x, 3, axis=1)

for i, x in enumerate(x_split):
    print(f'x_split[{i}]: \n{x}')
【実行結果】
x: 
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]

x_split[0]: 
[[ 0  1]
 [ 6  7]
 [12 13]
 [18 19]
 [24 25]
 [30 31]]
x_split[1]: 
[[ 2  3]
 [ 8  9]
 [14 15]
 [20 21]
 [26 27]
 [32 33]]
x_split[2]: 
[[ 4  5]
 [10 11]
 [16 17]
 [22 23]
 [28 29]
 [34 35]]

結果は配列(ndarray)のリストとして取得できます。

注意点として、分割する数は分割する方向の長さを割り切れる数である必要があります。例えば、6列の配列を4分割しようとするとValueErrorとなります。

hsplitを使用した分割

hsplit関数を使用して指定個数で分割する場合は、以下の例のように使用します。分割したい配列と分割個数を指定し実行します。

hsplitは列方向(水平方向)を意図した関数のため、axisの指定は必要ありません。

import numpy as np

x = np.arange(36).reshape((6, 6))
print(f'x: \n{x}\n')

# 配列を列方向(水平方向)に指定個数で分割する (hsplit)
x_split = np.hsplit(x, 3)

for i, x in enumerate(x_split):
    print(f'x_split[{i}]: \n{x}')
【実行結果】
x: 
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]

x_split[0]: 
[[ 0  1]
 [ 6  7]
 [12 13]
 [18 19]
 [24 25]
 [30 31]]
x_split[1]: 
[[ 2  3]
 [ 8  9]
 [14 15]
 [20 21]
 [26 27]
 [32 33]]
x_split[2]: 
[[ 4  5]
 [10 11]
 [16 17]
 [22 23]
 [28 29]
 [34 35]]

結果は配列(ndarray)のリストとして取得できます。

注意点として、分割する数は分割する方向の長さを割り切れる数である必要があります。例えば、6列の配列を4分割しようとするとValueErrorとなります。

指定位置で分割する方法

splitを使用した分割

split関数を使用して指定位置で分割する場合は、以下の例のように使用します。分割したい配列と分割位置リストを指定し実行します。

行方向(垂直方向)の分割との違いは、「axis=1」を指定して列方向の軸を指定している点です。行方向の場合は特に指定しませんでしたが、デフォルトでaxis=0が指定されています。

import numpy as np

x = np.arange(25).reshape((5, 5))
print(f'x: \n{x}\n')

# 配列を列方向(水平方向)に指定位置で分割する (split)
x_split = np.split(x, [2, 4], axis=1)

for i, x in enumerate(x_split):
    print(f'x_split[{i}]: \n{x}')
【実行結果】
x: 
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

x_split[0]: 
[[ 0  1]
 [ 5  6]
 [10 11]
 [15 16]
 [20 21]]
x_split[1]: 
[[ 2  3]
 [ 7  8]
 [12 13]
 [17 18]
 [22 23]]
x_split[2]: 
[[ 4]
 [ 9]
 [14]
 [19]
 [24]]

結果は配列(ndarray)のリストとして取得できます。

上記の例では、複数位置を指定していますが、例えばインデックス2の位置で2分割にしたいような場合には、[2]というように一要素を含むリストを指定すれば実行できます。

hsplitを使用した分割

hsplit関数を使用して指定位置で分割する場合は、以下の例のように使用します。分割したい配列と分割位置リストを指定し実行します。

hsplitは列方向(水平方向)を意図した関数のため、axisの指定は必要ありません。

import numpy as np

x = np.arange(25).reshape((5, 5))
print(f'x: \n{x}\n')

# 配列を列方向(水平方向)に指定位置で分割する (hsplit)
x_split = np.hsplit(x, [2, 4])

for i, x in enumerate(x_split):
    print(f'x_split[{i}]: \n{x}')
【実行結果】
x: 
[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

x_split[0]: 
[[ 0  1]
 [ 5  6]
 [10 11]
 [15 16]
 [20 21]]
x_split[1]: 
[[ 2  3]
 [ 7  8]
 [12 13]
 [17 18]
 [22 23]]
x_split[2]: 
[[ 4]
 [ 9]
 [14]
 [19]
 [24]]

結果は配列(ndarray)のリストとして取得できます。

上記の例では、複数位置を指定していますが、例えばインデックス2の位置で2分割にしたいような場合には、[2]というように一要素を含むリストを指定すれば実行できます。

Note
  • split関数のドキュメントの記載はこちらを参照してください。
  • vsplit関数のドキュメントの記載はこちらを参照してください。
  • hsplit関数のドキュメントの記載はこちらを参照してください。