2020年5月17日日曜日

【Numpy】インデックス・スライスによるndarray要素の取得

 多次元配列計算を効率よく実行できる数値計算ライブラリNumPyの配列型データ構造であるndarrayはリストやタプルと同様にインデックス・スライスによって要素を取得できる。

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

import numpy as np


1. 1次元ndarrayの場合

 要素が一列に並んだ形の1次元ndarrayに対しては、後ろに[]で囲ったインデックスを付けることで要素を取得できる。最初の要素がインデックス0となり順番に0,1,2とインデックス番号が付く。
イデックス1つまり2番目の要素を指定した場合。

import numpy as np

x = np.array([10, 20, 30, 40, 50, 60])
print(x[1])

実行結果

20


 インデックス番号に-(マイナス)を付けるとndarrayの後ろからの位置指定となる。一番最後の要素が-1、先頭方向に-2,-3となる。
イデックス-3つまり後ろから3番目の要素を指定した場合。

import numpy as np

x = np.array([10, 20, 30, 40, 50, 60])
print(x[-3])

実行結果

40


 インデックスではなくスライスを用いると範囲指定ができる。スライスの書式は[開始位置:終了位置:step]となる。stepを省略した場合は範囲の全ての要素を指定することとなる。またスライスによって取得した要素はndarrayとなる。
2つまり3番目から4つまり5番目までの要素を指定した場合。

import numpy as np

x = np.array([10, 20, 30, 40, 50, 60])
print(x[2:4])

実行結果

[30, 40]


 スライスの終了位置を省略すると開始位置とそれ以降の全ての要素が指定される。
3つまり4番目以降の要素を指定した場合。

import numpy as np

x = np.array([10, 20, 30, 40, 50, 60])
print(x[3:])

実行結果

[40, 50, 60]


 スライスの開始位置を省略すると終了位置より前(終了位置は含まれない)の全ての要素が指定される。
3つまり4番目までの要素を指定した場合。

import numpy as np

x = np.array([10, 20, 30, 40, 50, 60])
print(x[:3])

実行結果

[10, 20, 30]


2. 2次元ndarrayの場合

 2次元ndarrayは1次元ndarrayをカンマで区切って複数並べ[]で囲った構造。arrayの軸(要素が並ぶ向き)がaxis=0、axis=1の2方向となる。2次元ndarrayに対してインデックスを1つだけ付けた場合はaxis=0の向きのインデクシングとなり要素である1次元ndarrayを指定することになる。
インデックス[1]として2番目の要素を指定した場合。

import numpy as np

x = np.array([[10, 20, 30],
              [40, 50, 60]])
print(x[1])

実行結果

[40, 50, 60]


 カンマで区切って2つ目のインデックスを付ければ要素の中の要素を指定できる(axis=0、axis=1の2方向とも指定)。
axis=0をインデックス1(2番目の要素)、axis=1をインデックス2(3番目の要素)とした場合。

import numpy as np

x = np.array([[10, 20, 30],
              [40, 50, 60]])
print(x[1, 2])

実行結果

60


 1番目のインデックスを省略し2番目のインデックスのみ指定することでaxis=1方向に要素を指定できる。インデックスを省略する場合は:を用いる(スライシングで全要素を指定している)。

import numpy as np

x = np.array([[10, 20, 30],
              [40, 50, 60]])
print(x[:, 2])

実行結果

[30, 60]


1次元ndarray同様インデクシングが可能。

import numpy as np

x = np.array([[10, 20, 30],
              [40, 50, 60]])
print(x[1, 1:3])

実行結果

[50, 60]


3. 3次元ndarrayの場合

 例えば画像ファイルは x方向の位置、y方向の位置、RGB各画素の輝度 の3次元の配列となる。
このような3次元ndarrayにはaxis=0,1,2の3方向あるためインデックスの数字も3つになる。
次の例では最初のインデックス 1 で [[200, 210, 220], [230, 240, 250]] を選び(axis=0)
次のインデックス 1 で [230, 240, 250] を選び1(axis=1)
最後のインデックス 0 で 230 を選んでいる(axis=2)。

import numpy as np

x = np.array([[[100, 110, 120], [160, 170, 180]],
              [[200, 210, 220], [230, 240, 250]]])

print(x[1, 1, 0])

実行結果

230


インデックス・スライスの書き方は1次元、2次元と同様。
axis=0,1がコロン(:)により全てを選択、axis=2としている。

import numpy as np

x = np.array([[[100, 110, 120], [160, 170, 180]],
              [[200, 210, 220], [230, 240, 250]]])

print(x[:, :, 2])

実行結果

[[120 180]
 [220 250]]


4. リファレンス

NumPy > Indexing
NumPy > Quickstart tutorial
Scipy.org > NumPy > numpy.ndarray

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

0 件のコメント:

コメントを投稿