[Numpy]これで分かる!行列中の指定値の取得方法の解説1(Indexing)

numpy

概要

こんにちは。すのくろです。

今回はNumpyを使った行列の中の指定箇所の取り出し方法について説明します。

具体的な手法名はindexingとslicingと言います。これらの方法を用いることで作成した行列や、画像のデータのある値や範囲を取り出すことができるようになると思います。

今回は第一回としてIndexingについて解説したいと思います。解説内容は下記の通りです。

  • ベクトルから値を取得 → x[1] のようにインデックスを指定
  • 行列から値を取得① → x[1][2] のように、[行][列]の2段階でインデックスを指定
  • 行列から値を取得② → x[1, 2] のように、[行、列]でインデックスを指定

このIndexingと、後に解説するslicingといった手法は、Pythonを用いたデータ分析のためにで非常に重要な概念なので、ここでぜひ憶えていただけると幸いです。

それではやっていきましょう!

下準備:Numpyのインポート

まずはNumpyを使うためにライブラリをインポートします。インポートの方法は下記のコードの通りです。こちらはもう一般的なものなので、このままコピペでOKです。

# NumPyのインポートの仕方
import numpy as np

1列のみの行列(ベクトル)中の指定の値を取得

まず初めに1列のみの行列(ベクトル)で考えてみましょう。

# indexing
# 一列(ベクトル)の場合
v = np.array([1, 2, 3, 4])

上記の方法で1列のベクトルが作成されました。

このときこのベクトルvは↓の画像のように、左端から順番に0から番号が振られています。

これをインデックス(index)と言います。

そこで下記のように、[]で変数の後ろにindex番号を指定してあげることで、その場所(インデックス)の値をとってくることができます。

v[1]

出力結果↓

2

参考画像はこの通りです。

また、indexにマイナスをつけることで後ろから順番で指定することもできます。

print(v[-1])

出力結果↓

4

マイナス(-)をつける場面は例えば、

・「長い数列で後ろから数えた方が早い時」

・「行列の形は変わるけど常に1番後ろの数を取得したい」

と言った場合です。

複数行列中の指定の値を取得

次に、行列でのインデックスの表し方の説明です。

ベクトルに比べて1次元から2次元に増えただけなので、考え方は先ほどのベクトルと同じです。

# indexing
# 複数列(一般的な行列)の場合
m = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

# ある行を取り出すとき
print(m[0]) # 1行目を取り出し

出力結果↓

[1 2 3 4]

先ほどのベクトルと同じように[]内に一つのインデックスを指定すると、そのインデックスに指定した行の値全てが取れました。

ここで起きている状況を図で説明すると、以下のイメージです。

さらに、m[0]に続けて[]をつけることで、その行の中で指定箇所の列番号を取得することができます。

# ある行の中の一つの値を取り出すとき
print(m[0][1])  # 1行目を取り出し、その1行目の中の2列目を取り出し

出力結果↓

2

ここで起きている状況を図で説明すると、以下のイメージです。

つまり、まとめると、行列の場合

  1. まず、行の番号を指定
  2. 次に、列の番号を指定

の2段階を踏むことで、ある一つの値を取得することができます。

「 [行, 列] 」による行列の値の取得

2段階の方法を踏んで行列の値を取る方法の他に、複数の行と列を持つ行列の中で値を取得するコードの書き方について説明します。

方法は、[行番号、列番号] で書くだけです。

コードを示します。

m[0, 1] # こちらの書き方を推奨(1行、2列目の値を取り出す)

出力結果↓

2

[行、列]の書き方の方が、視覚的にもどこの場所(座標)をとっているのかわかりやすいと思います。

ですので、慣れてきたらこちらの方法で、行列から値を取得するように統一すると良いと思います。

まとめ

今回はNumpyを使った行列の中の指定箇所の取り出し方法について説明しました。

  • ベクトルから値を取得 → x[1] のようにインデックスを指定
  • 行列から値を取得① → x[1][2] のように、[行][列]の2段階でインデックスを指定
  • 行列から値を取得② → x[1, 2] のように、[行、列]でインデックスを指定

以上になります。続けてスライシング(slicing)についての解説記事も書きますのでそちらも続けてお読みいただけると、ほとんどの場合で行列の中の値を取得可能になるかと思いますのでよろしければそちらも参考になれば幸いです。

ここまでお読みいただき、ありがとうございました!

コメント

タイトルとURLをコピーしました