配列(ndarray)の部分要素へのアクセス(インデックス式、スライス式、ブーリアンマスク)

概要

配列の中の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)