-Numpy- スライシング

Numpyのスライシング機能を用いることで,配列の一部を取り出したり,入れ替えたりすることが可能になります.

1次元配列の場合は,以下のような形式で配列にアクセスすることができます.

配列名[インデックスa(以上):インデックスb(未満)]

とすることで,インデックスaとbの間の要素にアクセスすることができます.以下に例を示します.

>>> import numpy as np
>>> a = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> print(a[2:8])
[2 3 4 5 6 7]
>>> 
上記の例では,インデックスが2以上,8未満の要素が抜き出されて1次元の配列となっています.抜き出した配列の次元は,元の配列の次元と同じになります.
 
また,以下のように,ステップを指定して,飛び飛びの範囲を指定することも可能です.
配列名[インデックスc(以上): インデックスd(未満): ステップ]
>>> print(a[2:8:2])
[2 4 6]
>>> 
 
[ ] の中に : のみを書くと全ての要素を指定することになります.
>>> print(a[:])
[0 1 2 3 4 5 6 7 8 9]
>>> 
 

2次元配列の場合は,カンマで区切って各次元の範囲を指定します.

>>> b = np.array([[0, 1, 2],
...               [3, 4, 5],
...               [6, 7, 8]])
>>> print(b[0:2, 0:2])
[[0 1]
 [3 4]]
>>> 
この例では,最初の 0:2  の '0'はスタートの行(この場合は0行以上)'2'はエンドの行(この場合は2行未満),後の 0:2 の '0'はスタートの列(この場合は0列以上)'2'はエンドの列(この場合は2列未満)を指定しています.両方ともに 0:2だとわかりにくいので,以下に1行0列以上から3行3列未満までを抜き出す例を示します.
>>> print(b[1:3, 0:3])
[[3 4 5]
 [6 7 8]]
>>> 
 
スライシングを用いて指定した領域を置き換えることが可能です.配列bの左上,2x2領域を置き換える例を以下に示します.
>>> b[0:2, 0:2] = np.array([[9, 8], 
...                         [7, 6]])
>>> print(b)
[[9 8 2]
 [7 6 5]
 [6 7 8]]
 
3次元配列の領域を置き換える例を以下に示します.
まずは,要素が全て零の配列を作ります.
>>> c = np.zeros(18).reshape(2, 3, 3)
>>> print(c)
[[[0. 0. 0.]
  [0. 0. 0.]
  [0. 0. 0.]]
 
 [[0. 0. 0.]
  [0. 0. 0.]
  [0. 0. 0.]]]
>>> 
 
この配列の一部を,要素が全て1の2×2の配列で置き換えます.
3つの次元で置き換える範囲を指定しますが,最初の次元は : を使わずにインデックスを指定します.
>>> c[0, 0:2, 0:2] = np.ones(4).reshape(2, 2)
>>> print(c)
[[[1. 1. 0.]
  [1. 1. 0.]
  [0. 0. 0.]]
 
 [[0. 0. 0.]
  [0. 0. 0.]
  [0. 0. 0.]]]
>>>