概要
こんにちは。すのくろです。
今回はNumpyを使った行列の中の指定箇所の取り出し方法について説明します。
具体的な手法名はindexingとslicingと言います。これらの方法を用いることで作成した行列や、画像のデータのある値や範囲を取り出すことができるようになると思います。
過去の記事では第1回としてIndexingについて解説しました。
こちらを先にお読みいただけると、本記事の内容がより理解が深まると思います。
今回は第2回としてSlicingについて解説したいと思います。解説内容は下記の通りです。
- pythonのslicingにおける「:」の意味
- ベクトルから値の範囲を取得 → x[1:3] のようにインデックスを指定
- 行列から値の範囲を取得 → x[1:3, 2:] のように、[行範囲、列範囲]でインデックスを指定
このSlicingと、以前解説したIndexingといった手法は、Pythonを用いたデータ分析のために非常に重要な概念なので、ここでぜひ憶えていただけると幸いです。
それではやっていきましょう!
pythonのslicingにおける「:」の意味
初めに知識的な解説です。
スライシングでは、記号コロン「 : 」を使用します。
スライシングにおけるこのコロンのイメージは、「〜から〜まで」といった感じです。
この「 : 」を数字の前や後、またはコロンのみで行列の座標位置を示すことで、指定の範囲のデータ値を取得することができるようになります。
ベクトルから値の範囲を取得
それでは、実際にコードを書いてスライシングの使い方を確認していきましょう。
まずはベクトルやリストと言った一列のデータに対してです。
import numpy as np # NumPyのインポートの仕方
v = np.array([1, 2, 3, 4]) #ベクトルの生成
print(v[1:3])
出力結果↓
[2 3]
起きていることを図に表すと以下のとおりです。
注意する点は下記2点です。
・インデックス(順番)は0から始まる
・末尾(今回だと3)はその数を含まない(3未満)
なので、今回指定した[1:3]というのは、インデックス1、2(2番目と3番目のデータ)を指定していることになります。
[ : ] で全ての範囲を選択
次に、もし「:」だけを指定した場合は、どうなるかというと
v = np.array([1, 2, 3, 4])
print(v[:])
出力結果↓
[1 2 3 4]
のようになります。
「:」の前後に数値を指定しない場合、「(0) : (最後) 」と言ったイメージで、全ての範囲を示すことを意味します。
列や行を指定する際に列の値全てを取得することも多いと思いますので、これは是非覚えてもらえると幸いです。
同じ感覚で、
「指定値以降全て〜」
print(v[1:]) #1~
出力結果↓
[2 3 4]
「最初〜指定値未満」
print(v[:3]) #~3
出力結果↓
[1 2 3]
というふうになります。
あとは、インデックスでも触れたように、-(マイナス)をつけることで、後ろから数えた順番でも指定できます。
print(v[-1]) #後ろから
出力結果↓
4
後ろから前の方の値を全て選択する場合は、
print(v[:-1]) #後ろから
出力結果↓
[1 2 3]
行列の指定範囲の取得方法
次に、複数の行と列を持つ場合の行列について説明です。
と言っても、ベクトルの時とほぼ同じです。
① 複数行を指定する場合(m[A : B]), A以上B未満の行
m = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(m[1:3]) #2、3行目を抽出
出力結果↓
[[ 5 6 7 8]
[ 9 10 11 12]]
② 複数行と列を指定する場合(m[ A: B, C]), A以上B未満の行で、C列
print(m[1:3, 1]) #2、3行目の3列目を抽出
出力結果↓
[ 6 10]
イメージは下の感じです。
まとめ
今回の説明で、スライシングの知識を活用して簡単に行と列の指定範囲を示すことができることがわかったかと思います。こちらの知識はnumpyやpandas(表データ処理)で頻繁に使う知識なので、ここで是非覚えてもらえると幸いです。
過去の記事Indexingについての解説記事(こちら)も復習でお読みいただけると、indexing, slicingの内容がさらに理解が深まると思います。
ここまでお読みいただき、ありがとうございました!
コメント