3.Numpy配列の形状変更

3.1.配列の形状変更

配列の形状を変える場合、reshapeを用います。
numpy.reshape(a, newshape, order)
引数 設定 デフォルト 説明
a 必須 - 変形する前のNumpy配列を指定します。
newshape 必須 - 変形させたい形状を指定します。

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

#
>>> np.reshape(x,(2,5))
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])

#配列サイズとnewshapeのサイズが一致しない場合 → エラー
>>> np.reshape(x,(3,3))
Traceback (most recent call last):
  ・・・
  ValueError: cannot reshape array of size 10 into shape (3,3)

3.2.配列の連結

  1. 複数の配列を1つにまとめる
  2. 垂直/水平方向に配列を結合する

(1)複数の配列を1つにまとめる

numpy.concatenate([a1, a2, …], axis, order)
引数 設定 デフォルト 説明
a1, a2, … 必須 - 結合するNumpy配列を指定します。
axis 省略可 0 結合する軸を指定します(0=一次、1=二次)。

>>> a1 = np.array([1,2,3])
>>> a2 = np.array([4,5,6])
>>> a3 = np.array([7,8,9])

#3つの配列を結合する場合(リスト、タプルどちらでもOK)
>>> np.concatenate([a1,a2,a3])
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> np.concatenate((a1,a2,a3))
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

#3つの配列を二次配列として結合する場合
#a1, a2, a3をそれぞれ二次配列[a1], [a2], [a3]の形にして行方向に結合する
>>> np.concatenate([[a1],[a2],[a3]],axis=0)
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

#次のように指定すると一次配列として結合される。
>>> np.concatenate([[a1],[a2],[a3]],axis=1)
array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])

#異なる次元の配列を結合する場合は、次元を合わせる
>>> np.concatenate([b1,[a3]])
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

#次元を合わせないと...
>>> np.concatenate([b1,a3])
Traceback (most recent call last):
・・・
ValueError: all the input arrays must have same number of dimensions, ・・・

次に示すvstack、hstackよりも設定の自由度は高くなります。

節はじめに戻る


(2)垂直/水平方向に配列を結合する

リストまたはNumpy配列によってもNumpy配列から複数要素を取得できます。
  • 垂直:numpy.vstack(tup)
  • 水平:numpy.hstack(tup)
引数 設定 デフォルト 説明
tup 必須 - 結合するNumpy配列をタプルで指定します。

>>> a1 = np.array([1,2,3])
>>> a2 = np.array([4,5,6])
>>> a3 = np.array([7,8,9])

#垂直方向に結合する場合
>>> np.vstack((a1,a2,a3))
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

#水平方向に結合する場合
>>> np.hstack((a1,a2,a3))
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

>>> a3 = np.array([7,8,9])
>>> b1
array([[1, 2, 3],
       [4, 5, 6]])

#垂直方向に結合する場合
>>> np.vstack((b1,a3))
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

#同じ配列にhstackを適用すると...
>>> np.hstack((b1,a3))
Traceback (most recent call last):
・・・
ValueError: all the input arrays must have same number of dimensions, ・・・

節はじめに戻る


3.3.配列の分割

  1. 1つの配列を複数に分割する
  2. 垂直/水平方向に配列を結合する

(1)1つの配列を複数に分割する

numpy.split(a, indices_or_sections, axis)
引数 設定 デフォルト 説明
a 必須 - 分割するNumpy配列を指定します。
indices or sections 必須 - 整数で指定する場合、分割個数を指定します。 等分割できない場合はエラーになります。
リストで指定する場合は、分割する位置を指定します(0から始まる)。
axis 省略可 0 結合する軸を指定します(0=一次、1=二次)。

>>> z
array([[  0,   1,   2,   3,   4],
       [  0,  10,  20,  30,  40],
       [  0, 100, 200, 300, 400]])

#行方向で分解する場合 → 第二引数は整数で指定
>>> np.split(z,3)
[array([[0, 1, 2, 3, 4]]), array([[ 0, 10, 20, 30, 40]]), array([[  0, 100, 200, 300, 400]])]

#列方向で分解する場合
>>> np.split(z,5,axis=1)
[array([[0],
       [0],
       [0]]), array([[  1],
       [ 10],
       [100]]), array([[  2],
       [ 20],
       [200]]), array([[  3],
       [ 30],
       [300]]), array([[  4],
       [ 40],
       [400]])]

#指定する位置で分割する場合 → 第二引数はリストで指定
#(1列目、2列目、3列目以降で列方向に分解)
>>> np.split(z,[1,2,3],axis=1)
[array([[0],
       [0],
       [0]]), array([[  1],
       [ 10],
       [100]]), array([[  2],
       [ 20],
       [200]]), array([[  3,   4],
       [ 30,  40],
       [300, 400]])]

次に示すvstack、hstackよりも設定の自由度は高くなります。

節はじめに戻る


(2)垂直/水平方向に配列を結合する

  • 垂直:numpy.vsplit(a, indices_or_sections)
  • 水平:numpy.hsplit(a, indices_or_sections)
使い方は(1)splitとほぼ同じで、軸方向の設定が不要になります。
引数 設定 デフォルト 説明
a 必須 - 分割するNumpy配列を指定します。
indices or sections 必須 - 整数で指定する場合、分割個数を指定します。 等分割できない場合はエラーになります。
リストで指定する場合は、分割する位置を指定します(0から始まる)。

>>> z
array([[  0,   1,   2,   3,   4],
       [  0,  10,  20,  30,  40],
       [  0, 100, 200, 300, 400]])

#行方向で分解する場合 → 第二引数は整数で指定
>>> np.vsplit(z,3)
[array([[0, 1, 2, 3, 4]]), array([[ 0, 10, 20, 30, 40]]), array([[  0, 100, 200, 300, 400]])]]

節はじめに戻る



参考文献