2.3.Numpy配列の結合・分解

  1. 横方向の結合
  2. 縦方向の結合
  3. 深さ方向
  4. 任意方向の結合
  5. 分解

(1)横方向の結合

  • numpy.hstack((array, array, ...))
横(列)方向でNumpy配列の結合を行います。
>>> a = np.array([1,2,3])
>>> b = np.array([4,5])
>>> np.hstack((a,b))
array([1, 2, 3, 4, 5])

多次元配列でも横(列)方向の結合できます。
例えば2つの行列を結合させるとき、それらの行数を合わせる必要があります。
#2×3行列と2×1行列の列方向結合(2×4行列)
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> b = np.array([[0],[0]])
>>> b
array([[0],
       [0]])
>>> np.hstack((a,b))
array([[1, 2, 3, 0],
       [4, 5, 6, 0]])


#3次元列ベクトルどうしの結合(3×2行列)
>>> a = np.array([[1],[2],[3]])
>>> a
array([[1],
       [2],
       [3]])

>>> b = np.array([[4],[5],[6]])
>>> b
array([[4],
       [5],
       [6]])

>>> np.hstack((a,b))
array([[1, 4],
       [2, 5],
       [3, 6]])

節はじめに戻る


(2)縦方向の結合

  • numpy.vstack((array, array, ...))
縦(行)方向でNumpy配列を結合します 多次元配列でも縦(行)方向の結合できます。
例えば2つの行列を結合させるとき、それらの列数を合わせる必要があります。
>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])
>>> np.vstack((a,b))
array([[1, 2, 3],
       [4, 5, 6]])

>>> a = np.array([[1],[2],[3]])
>>> b = np.array([[4],[5],[6]])
>>> np.vstack((a,b))
array([[1],
       [2],
       [3],
       [4],
       [5],
       [6]])

節はじめに戻る


(3)深さ方向

  • numpy.dstack((array, array, ...))
配列を一次元深くして結合します。
>>> a = np.array([0,1,2])
>>> b = np.array([3,4,5])
>>> np.dstack((a,b))
array([[[0, 3],
        [1, 4],
        [2, 5]]])

>>> a = np.array([[1],[2],[3]])
>>> a
array([[1],
       [2],
       [3]])

>>> b = np.array([[4],[5],[6]])
>>> b
array([[4],
       [5],
       [6]])

>>> np.dstack((a,b))
array([[[1, 4]],

       [[2, 5]],

       [[3, 6]]])

節はじめに戻る


(4)任意方向の結合

  • numpy.concatenate((array, array, ...), axis = 0)
(array, array, ...) 結合したい配列を指定します。
axis 配列を結合する軸方向を指定します。 未指定時は“0”が適用されます(1次(縦/行)方向)。 1を指定すると2次(横/列)方向に結合します。

>>> a = np.array([[1,2],[3,4]])
>>> b = np.array([[5,6]])
>>> np.concatenate((a,b))
array([[1, 2],
       [3, 4],
       [5, 6]])

>>> b = np.array([[5],[6]])
>>> np.concatenate((a,b),axis=1)
array([[1, 2, 5],
       [3, 4, 6]])


  • numpy.stack(arrays, axis = 0)
(array, array, ...) 結合したい配列を指定します。 指定した配列は同じ型(shape)でなければなりません。
axis 配列を結合する軸方向を指定します。 未指定時は“0”が適用されます(1次(縦/行)方向)。 1を指定すると2次(横/列)方向に結合します。

>>> a = np.array([1,2,3])
>>> b = np.array([4,5,6])

>>> np.stack((a,b))
array([[1, 2, 3],
       [4, 5, 6]])

>>> np.stack((a,b),axis=1)
array([[1, 4],
       [2, 5],
       [3, 6]])

節はじめに戻る


(5)分解

  • 指定方向の分解:numpy.split(array, indices or sections, axis = 0)
  • 行方向の分解:numpy.vsplit(array, indices or sections)
  • 列方向の分解:numpy.hsplit(array, indices or sections)
  • 深さ方向の分解:numpy.dsplit(array, indices or sections)
array 分割したい配列を指定します。
indices or sections 分割したい配列要素数が割り切れる数で指定します。 割り切れない場合はエラーが出ます。
axis 配列を結合する軸方向を指定します。 未指定時は“0”が適用されます(1次(縦/行)方向)。 1を指定すると2次(横/列)方向に結合します。

#一次配列
>>> a = np.array([0,1,2,3,4,5,6,7,8])

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

#上記と同じ結果が得られます。
>>> np.hsplit(a,3)
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]

#indices or sectionsで配列要素数が割り切れない場合、エラーがでます。
>>> np.hsplita(a,2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'numpy' has no attribute 'hsplita'

#多次元配列
>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

>>> np.hsplit(a,3)
[array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]]), array([[3],
       [6],
       [9]])]

>>> np.vsplit(a,3)
[array([[1, 2, 3]]), array([[4, 5, 6]]), array([[7, 8, 9]])]

#axis = 1を指定することでvsplitと同じ結果が得られます。
>>> np.split(a,3,axis=1)
[array([[1],
       [4],
       [7]]), array([[2],
       [5],
       [8]]), array([[3],
       [6],
       [9]])]

節はじめに戻る


参考文献