この記事ではNumPyのindexにまつわる話、特に要素を取り出す方法についてまとめました。
基本的にはlistと同様に扱うことができます。
なのでその点だけ理解しておけばnp.arrayのインデックスを使った操作は簡単です。
ただし、np.whereのようなNumPy専用の関数もあるので、このあたりについて興味がある方は一緒に学んでいきましょう。
indexを指定して要素の参照を取り出す
NumPyの配列(np.array)はリストのように使うことができます。
なので取り出したい要素の座標を指定することで、要素を取り出すことができます。
また、スライス記法が使えるので、一括で複数の要素を取り出すことも可能です。
import numpy as np a = np.arange(0,20).reshape(5,-1) print("original:") print(a) # 座標を指定した要素の切り出し print("aの0行1列の要素:") print(a[0,1]) # 複数の要素を同時に切り出すことも可能 これはリストにしてもタプルにしてもOK print("aの0行1列の要素と1行3列の要素:") print(a[(0,1),(1,3)]) # スライス記法も使える print("全ての行の、1列目から-1列(2列)目の要素をスライス:") print(a[:, 1:-1])
Out
original: [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19]] aの0行1列の要素: 1 aの0行1列の要素と1行3列の要素: [1 7] 全ての行の、1列目から-1列(2列)目の要素をスライス: [[ 1 2] [ 5 6] [ 9 10] [13 14] [17 18]]
True/Falseで指定して要素の参照を取り出す
True, Falseで要素を取り出すこともできます。
取り出したい要素や行・列をTrue、それ以外をFalseにします。
# 0~2行目までの全ての列を取り出す a[[True,True,True,False,False],:]
Out
array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
この方法は要素数が少ない場合は簡単ですが、普通はnp.whereを使った方が簡単にほしい要素を取り出すことができます。
ちなみに、ただa[True]とだけ書いた場合はすべての要素がTrue、a[False]と書いた場合はすべての要素がFalseになります。
#True, Falseで要素を取り出す print("a[True]") print(a[True]) print("a[False]") print(a[False])
Out
a[True] [[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19]]] a[False] []
np.where
配列の要素に対して、特定の条件に合致したindexを取り出す関数がnp.whereです。
この関数を使えば、例えば「要素が偶数の場合だけ2乗する」のようなif文的な操作ができます。
この操作については以下の記事で詳しく解説しています。
その他indexに関連する関数
NumPyでindexの配列を出力する関数は、np.where以外にもいろいろあります。
まずはnp.argmax / np.argmin。
これらは最大値を返すnp.max/ 最小値を返すnp.minのindexを返すバージョンです。
次にnp.argsort、これも要素でソートしてindexの配列を返します。
まとめ
この記事ではNumPy配列のインデックスに関連する機能をまとめました。
NumPyの要素へのPython関数からのアクセスはボトルネックになることが多いため、NumPyには様々なインデックスに関する関数が用意されてます。
むやみにfor文やif文を使わずに、できるだけNumPyの機能で完結させるようにしましょう。