この記事では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の機能で完結させるようにしましょう。






