2021年6月25日金曜日

【Numpy】ndarrayの分割

Numpyの配列型データ構造であるndarrayを分割する方法について説明する。

Numpyを使う際にはimportが必要。しばしばnpと略される。

import numpy as np


1. splitによる分割

splitによりndarrayが分割される。書式は以下の通り。

numpy.split(ary, indices_or_sections, axis=0)
引数 意味
ary:ndarray 分割するndarray
indices_or_sections:int or 1-D array 整数の場合その個数のndarrayに等分される。昇順の数字からなる1次元のリストを指定した場合その数字をインデックスとして分割される
axis:int, optional 分割する向きの指定。指定が無い場合はデフォルトの0となる。

0~8の9個の要素からなる1次元のndarrayを三等分する場合。indices_or_sectionsに3を指定する。
分割前のndarray

import numpy as np

x = np.arange(9)
x

実行結果

array([0, 1, 2, 3, 4, 5, 6, 7, 8])

3分割後

import numpy as np

x = np.arange(9)
np.split(x, 3)

実行結果

[array([0., 1., 2.]), array([3., 4., 5.]), array([6., 7., 8.])]


分割後の要素を取り出すには分割数分の変数で受け取る。

import numpy as np

x = np.arange(9)
y1, y2, y3 = np.split(x, 3)
y1

実行結果

array([0, 1, 2])


スライスしても良い。

import numpy as np

x = np.arange(9)
y = np.split(x, 3)[0]
y

実行結果

array([0, 1, 2])


等分割できない数を指定するとエラーとなる。0~8の9個の要素からなる1次元のndarrayに対してindices_or_sectionsに2を指定した場合、2等分できないためエラーとなる。

import numpy as np

x = np.arange(9)
np.split(x, 2)

実行結果

ValueError: array split does not result in an equal division


indices_or_sectionsにリストを指定するとその数字をインデックスとして分割される。3,5,9を指定した場合、3つ目の要素まで、4つ目から5つ目の要素まで、6つ目から9つ目の要素までの3つに分割される。

import numpy as np

x = np.arange(9)
np.split(x, [3,5,9])

実行結果


[array([0, 1, 2]), array([3, 4]), array([5, 6, 7, 8]), array([], dtype=int32)]


2次元のndarrayを分割する例。3行3列の2次元ndarrayが、3つの1行3列の2次元ndarrayに等分される。
分割前のndarray

import numpy as np

x = np.arange(9).reshape(3, 3)
x

実行結果

array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

分割後

import numpy as np

x = np.arange(9).reshape(3, 3)
np.split(x, 3)

実行結果

[array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]


2次元のndarray分割の際に向きを指定した場合。向きをaxis=1と指定するとデフォルト(axis=0)に対して直行した方向に分割される。

import numpy as np

x = np.arange(9).reshape(3, 3)
np.split(x, 3)

実行結果

[array([[0],
        [3],
        [6]]), 
 array([[1],
        [4],
        [7]]), 
 array([[2],
        [5],
        [8]])]


2. array_splitによる分割

array_splitによりndarrayが分割される。要素数が分割数で割り切れなくてもエラーとならない点がsplitと異なる。書式は以下の通りでsplitと同じ。

numpy.array_split(ary, indices_or_sections, axis=0)

要素数9のndarrayを2つに分割する場合。要素数5、要素数4の2つに分割される。

import numpy as np

x = np.arange(9)
np.array_split(x, 2)

実行結果


[array([0, 1, 2, 3, 4]), array([5, 6, 7, 8])]


要素数9のndarrayを5つに分割する場合。要素数2のarray4つと要素数1のarray1つに分割される。

import numpy as np

x = np.arange(9)
np.array_split(x, 5)

実行結果

[array([0, 1]), array([2, 3]), array([4, 5]), array([6, 7]), array([8])]


3. hsplitによる水平方向分割

hsplitによりndarrayが水平方向に分割される。splitaxis = 1とした場合と同じ。

要素数16の4行4列のndarrayを2つに分割する場合。2つの4行2列のndarrayに分割される。
分割前

import numpy as np

x = np.arange(16).reshape(4, 4)
x

実行結果

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

分割後

import numpy as np

x = np.arange(16).reshape(4, 4)
np.hsplit(x,2)

実行結果

[array([[ 0,  1],
        [ 4,  5],
        [ 8,  9],
        [12, 13]]), array([[ 2,  3],
        [ 6,  7],
        [10, 11],
        [14, 15]])]


4. vsplitによる垂直方向分割

vsplitによりndarrayが垂直方向に分割される。splitaxis = 0とした場合と同じ。

要素数16の4行4列のndarrayを2つに分割する場合。2つの2行4列のndarrayに分割される。
分割前

import numpy as np

x = np.arange(16).reshape(4, 4)
x

実行結果

array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

分割後

import numpy as np

x = np.arange(16).reshape(4, 4)
np.vsplit(x,2)

実行結果

[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
        [12, 13, 14, 15]])]


5. dsplitによる深さ方向分割

dsplitにより3かそれ以上の次元を持つndarrayが深さ方向に分割される。splitaxis = 2とした場合と同じ。

要素数12の3x2x2のndarrayを深さ方向に2つに分割する場合。
分割前

import numpy as np

x = np.arange(12).reshape(3, 2, 2)
x

実行結果

array([[[ 0,  1],
        [ 2,  3]],

       [[ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11]]])

分割後

import numpy as np

x = np.arange(12).reshape(3, 2, 2)
np.dsplit(x, 2)

実行結果

[array([[[ 0],
         [ 2]],
 
        [[ 4],
         [ 6]],
 
        [[ 8],
         [10]]]), array([[[ 1],
         [ 3]],
 
        [[ 5],
         [ 7]],
 
        [[ 9],
         [11]]])]


6. リファレンス

Scipy.org > Numpy > numpy.split
Scipy.org > Numpy > numpy.array_split
Scipy.org > Numpy > numpy.hsplit
Scipy.org > Numpy > numpy.vsplit
Scipy.org > Numpy > numpy.dsplit

使用バージョン:Python 3.7.0/numpy 1.18.4

0 件のコメント:

コメントを投稿