[numpy] インデックス操作 (Indexing) まとめ

About

Python の数値計算ライブラリ numpy を使う上で必須であるインデックス操作についてまとめた.

以下のコードを実行するには,まず numpy を import する.

import numpy as np

Shallow Copy と Deep Copy

ndarray の一部をインデックス操作 (indexing)で切り出したものをスライス (slice)という.

スライスは元の配列の参照なので,スライスを変更すると元の配列も変わってしまう.

>>> x = np.array([1,2,3,4,5,6,7,8,9])
>>> y = x[:3]
>>> y
array([1, 2, 3])
>>> y[0] = 100
>>> y
array([100,   2,   3])
>>> x
array([100,   2,   3,   4,   5,   6,   7,   8,   9])

copy()を使えば,参照ではなく新たな ndarray が作成されるので,切り出した配列を変更しても,元の配列が変わってしまうことはない.

>>> x = np.array([1,2,3,4,5,6,7,8,9])
>>> y = x[:3].copy()
>>> y
array([1, 2, 3])
>>> y[0] = 100
>>> y
array([100,   2,   3])
>>> x
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

インデックス操作 (Indexing)

1次元配列

次の1次元配列に対する操作を見ていく.

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

array[index]

インデックスを1つ指定する.

>>> x[0]
0

array[start:]

start を指定すると,[start, 9] のスライスが作成される.

>>> x[6:]
array([6, 7, 8, 9])

array[:end]

end を指定すると,[0,end) のスライスが作成される.
Python の list 同様,end の要素はスライスに含まれないことに注意する.

>>> x[:4]
array([0, 1, 2, 3])

array[start:end]

start 及び end を指定すると,[start,end) のスライスが作成される.

>>> x[2:6]
array([2, 3, 4, 5])

array[start:end:stride]

stride を指定すると,[start,end) まで stride ずつ値を取り出したスライスが作成される.

>>> x[1:10:2]
array([1, 3, 5, 7, 9])

2次元配列

次の2次元配列に対する操作を見ていく.

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

この場合,”要素数3の配列”の各要素が”要素数3の配列”になっていると考える.
カンマで区切って軸ごとの start:end:stride を記述する.
array[軸0に対する操作,軸1に対する操作]

軸0に対する操作

軸1に対する操作を省略した場合は軸0に対する操作のみ行われる.

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

軸0及び軸1に対する操作

>>> x[1:,1:]
array([[4, 5],
       [7, 8]])

>>> x[1][1]
4

3次元配列

3次元配列にでも考え方は同様である.

x = np.array([[[0,1],[2,3]],
              [[4,5],[6,7]]])

この場合,”要素数2の配列”の各要素が”要素数2の配列”の各要素が”要素数2の配列”になっていると考える.
カンマで区切って軸ごとの start:end:stride を記述する.
array[軸0に対する操作,軸1に対する操作,軸2に対する操作]


軸0,軸1及び軸2に対する操作

>>> x[1]
array([[4, 5],
       [6, 7]])
>>> x[1][1]
array([6, 7])
>>> x[1][1][0]
6

n次元配列

例は省略するが,n次元配列でも同様である.
array[軸0に対する操作, 軸1に対する操作, …, 軸nに対する操作] とかけばよい.
また \(k \le n\) としたとき, \(k\) 以降の軸の操作は省略できることも同様である.
array[軸0に対する操作, 軸1に対する操作, …, 軸kに対する操作]

コメントを残す

メールアドレスが公開されることはありません。