概要
配列の中の1要素のみ、または、ある範囲のみのデータを取り扱う方法を紹介します。
インデックス式
インデックス式によって、任意の要素にアクセスできます。
例えば、5行,5列の配列aがあるとします。
>>> a = np.arange(25).reshape((5,5))
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
配列aの2行目,3列目の要素を取り出したければ、下記の様にインデックス演算子[ ]を配列名の後ろに記入し、その中に行,列の順にインデックスの値を記入します。ここで、インデックスは0から数えることに注意して下さい。
>>> a[1, 2]
7
上記の式を左辺として右辺に代入したい値を記入すれば、この要素に値を代入できます。
>>> a[1, 2] = 100
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 100, 8, 9],
[ 10, 11, 12, 13, 14],
[ 15, 16, 17, 18, 19],
[ 20, 21, 22, 23, 24]])
また、下記のように負のインデックス値を記入すると、後方からの位置を指定できます。
>>> a[-1, -2]
23
スライス式
スライス式によって、指定した範囲の要素にアクセスできます。
colon ( : )のみをインデックス式の中に記入すると、その軸の要素全てを表します。
下記の例では、3列目の全ての行の要素にアクセスしています。
>>> a[:, 2]
array([ 2, 100, 12, 17, 22])
colon ( : )の前にインデックス値を記入すると、その値以降の要素にアクセスできます。
下記の例では、3行目以降の全ての列の要素にアクセスしています。
>>> a[2:, :]
array([[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
なお、後方のインデックス値(ここでは列を示すインデックス)は全要素にアクセスしたい場合は省略可能で、下記のように書いても同じ結果となります。
>>> a[2:]
array([[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
colon ( : )の後にインデックス値を記入すると、その値より前の要素にアクセスできます。
下記の例では、2行目までの要素にアクセスしています。
>>> a[:2]
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 100, 8, 9]])
colon ( : )の前と後にインデックス値を記入すると、アクセスしたい要素の範囲を指定できます。
下記の例では、2行目から4行目までの要素にアクセスしています。
>>> a[1:4]
array([[ 5, 6, 100, 8, 9],
[ 10, 11, 12, 13, 14],
[ 15, 16, 17, 18, 19]])
さらにcolon ( : )をもう一つ付け加え、その後に周期を指定することができます。
下記の例では、2行目から4行目までの要素に2行周期でアクセスしています。
>>> a[1:4:2]
array([[ 5, 6, 100, 8, 9],
[ 15, 16, 17, 18, 19]])
ブーリアンマスク
ブール型の同じ大きさの配列を使って、True, Falseでアクセスしたい要素を指定することができます。
下記のように、インデックス式の中にブール型の配列を記入します。
>>> a = np.array([0, 1, 2, 3, 4])
>>> mask = np.array([True, False, False, True, False])
>>> a[mask]
array([0, 3])
比較演算子を使うとブール型の配列が生成されるので、例えば2より大きい要素にアクセスしたいといった場合には、下記のように書けば実現できます。
>>> mask = a > 2
>>> mask
array([False, False, False, True, True])
>>> a[mask]
array([3, 4])
関連項目 配列(ndarray)