はじめてのNumpy 2.要素の取り出し

f:id:wataru_boss:20180626222601p:plain
こんにちは。BOSSです。

はじめてのNumpyシリーズです。

前回はアレイの作成と要素へのアクセスを学習しました。
はじめてのNumpy 1.アレイの作成と要素へアクセス - 機械学習はじめました。

今回はアレイのスライス、そして指定した値のみ取り出す

という方法について学習していきます。

スライス

任意の範囲を選択

前回同様、以下のようなアレイを作成します。

import numpy as np

arr = np.array([[1, 2, 3, 4, 5], [2, 3, 4, 5, 6], [3, 4, 5, 6, 7]])

形を見てみるとこんな感じです。

array([[1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6],
       [3, 4, 5, 6, 7]])

このアレイ全体の中から任意の一部分だけをスライスを用いて取り出していきます。今回は以下の図の部分を取り出して見ましょう。

f:id:wataru_boss:20180626112745p:plain

スライスを用いる場合は次元のどこからどこを取り出すかを指定できます。

この場合は
1次元目(配列の行)は0行と1行目
2次元目(配列の列)は2列目〜4列目

を指定すれば良いことがわかります。
※インデックスは0スタートであることに注意

以上のことを以下のように記述します。

# 1次元目の0から1、2次元目の2から4を取り出す
arr[0:2, 2:5]

arr[1次元目の範囲, 2次元目の範囲]

で指定されます。範囲の指定は
スタート: 終わり+1

という形であることがわかります。実行してみますと以下の通り。

array([[3, 4, 5],
       [4, 5, 6]])

上の図、緑の枠線で囲まれた部分が取り出されている

ということが確認できるかと思います。

スライスの省略

さて、スライスの使い方はわかりました。

スライスは一部省略することのできる形があります。その形を見ていきましょう。

1次元目のスタートを省略

1次元目は0から指定した範囲までが取り出されます。
2次元目は全範囲選択。

# 一つ目を省略すると最初から指定したところまで取り出される
# 1次元目の0と1が取り出されることになる
print(arr[:2])
print('\n')

この場合は0から1までです。

[[1 2 3 4 5]
 [2 3 4 5 6]]

1次元目の終わりを省略

1次元目は指定したところから最後までが取り出されます。
2次元目は全範囲になります。

# 二つ目を省略すると指定したところから最後まで取り出される
# 1次元目の1と2が取り出されることになる
print(arr[1:])
print('\n')

この場合1から最後(2)までです。

[[2 3 4 5 6]
 [3 4 5 6 7]]

1次元目を全て省略

1次元目は全範囲選択されます。 2次元目は指定した範囲が取り出されます。

# 両方省略すると全範囲となる
# 1次元目は全範囲、2次元目は2と3が取り出されることになる
print(arr[: , 2:4])

この場合は2次元目が2から3が取り出されます。

[[3 4]
 [4 5]
 [5 6]]

条件を指定して要素を取り出す

ある条件を満たす要素のだけ取り出すには

np.where(条件)

というメソッドを使います。例えば作ったアレイのうち4未満となる値を取得してみます。

f:id:wataru_boss:20180626215448p:plain

こんな感じの取り出し範囲になるかと思います。

次元だけ取り出すとこのようになります。

# 4未満の数字の次元が取得できる
print(np.where(arr < 4))
(array([0, 0, 0, 1, 1, 2]), array([0, 1, 2, 0, 1, 0]))

左側が1次元目のインデックス、右側が2次元目のインデックスで、それぞれが対応してます。
上図三角形のインデックスに相当するか確認して見てください。

次元ではなく値を取り出すときは次のようにします。

実際の値を取り出すにはこのようにする

print(arr[np.where(arr < 4)])
[1 2 3 2 3 3]

これで条件に合致した値が無事取り出せました。

まとめ

第二回になる今回はアレイの中から値を取り出すということにフォーカスしてまとめていきました。

次回は演算の仕方を予定しておきます。
それでは。