【NumPy入門】配列のindexの使い方と関係する関数たちについて

この記事では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文的な操作ができます。

この操作については以下の記事で詳しく解説しています。

【NumPy入門 np.where】条件にあったIndexの取得とif文的な使い方
更新日 : 2020年5月8日

その他indexに関連する関数

NumPyでindexの配列を出力する関数は、np.where以外にもいろいろあります。

まずはnp.argmax / np.argmin

これらは最大値を返すnp.max/ 最小値を返すnp.minのindexを返すバージョンです。

【NumPy入門 np.argmax】配列要素の最大値のインデックスを取得する
更新日 : 2020年5月8日

次にnp.argsort、これも要素でソートしてindexの配列を返します。

【NumPy入門 np.argsort】配列をソートしてインデックスを返す関数
更新日 : 2020年5月8日

まとめ

この記事ではNumPy配列のインデックスに関連する機能をまとめました。

NumPyの要素へのPython関数からのアクセスはボトルネックになることが多いため、NumPyには様々なインデックスに関する関数が用意されてます。

むやみにfor文やif文を使わずに、できるだけNumPyの機能で完結させるようにしましょう。

LINEで送る
Pocket

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

フクロウ

フクロウ

第一言語はPythonです。
皆さんRustやりましょう。