Python,NumPyの基礎② ~インデックス参照とスライシング~

記事内に広告が含まれています。

どうも!僕です!
つか◯です!

「NumPy使って配列作ったけど、要素ってどうやって参照すんねん!」

「うまいこと狙ったとこ参照できひんわ!」

って、なりますよね! 少なくともつか◯はなりました!

ここでは,NumPyの配列、ndarrayでのインデックス参照とスライシングについて、紹介します!
リストと同様の考え方の部分について書いていくので、基礎を押さえていきましょう!

色々調べたけど、書いてあることが難しすぎて、よく分からないって方にも理解できるような内容にしていきますので、もし、わからないところがあれば、コメントください!

また,NumPyについての説明は「NumPyの基礎① ~NumPyとは?編~」で行っていますので,復習がてらご覧ください.

インデックス参照

インデックス参照とは、「配列の各要素に割り当てられた値(=インデックス)を用いて、要素を抽出する」ことです。

まず、Python上でndarrayの配列を作りましょう。
ここは黙って、下記のプログラムを実行しましょう。

arr = np.array([2, 4, 6, 8, 10, 12])
arr
array([ 2,  4,  6,  8, 10, 12])

すると、2 ~ 12 までの偶数のみを格納した配列が作成されました。
この配列の要素には下図のように、番号が割り振られています。

このインデックスが何に役立つかというと、インデックスで指定した値を抽出することができます!

「は?」

ですよね.

たとえば、上記の配列の3番目の要素,つまりインデックスの2番を知りたいなってときに、

arr[2]
6

とすることで、欲しい部分の要素を取り出すことができます。
この機能(?)を「インデックス参照」などと呼びます。

次は、スライスによる参照を見ていきましょう!

スライス

スライスは、連続したインデックスの値、指定した範囲の値を取り出すことができます。
たとえば、「2番目から5番目(4, 6, 8, 10)を取り出したいな~」って時に活用します。

これは「:」を使うことで、取り出したいインデックスの範囲を指定できます。
では、実際に2番目から5番目(4, 6, 8, 10)を取り出してみましょう!

arr[1:5]
array([ 4,  6,  8, 10])

となります。

多くの人が「「1, 2, 3, 4」のインデックスじゃないの?」と混乱すると思います。

というのも、このインデックスは、スタートはそのまま、エンドは「取り出したい範囲の最後のインデックス+1」しないといけないんですね。

これをイメージにすると、下図のようになります。

青い部分が選択範囲です.
これは一朝一夕では慣れないと思うので、最初のうちの少ないデータで慣れていきましょう!

ここまでは、リストとndarrayは同様の考え方で行うことができます。

ndarrayの高次元配列におけるインデックスとスライスについては,次回詳紹介しますので,少々お待ちください!

番外編 ~ndarrayとリストの違い~

少し難しい話ですが,なるほどと思ったことについて,紹介します.
つか〇も深くは理解できていないですが,概念的に紹介できればと思います.

それは,

「コピーが生成されるかビューのままか」

です.

なんじゃそりゃ?ですよね.

これは,インデックス参照したときに,新しく値を代入できるかどうか,編集できるかどうかの違いです.
まず,ndarrayから見ていきましょう.

arr = np.arange(10)
print(arr)
arr2 = arr[3:6]
arr2[:] = 100
print(arr)

このコードを実行すると,以下のように出力されます.


[0 1 2 3 4 5 6 7 8 9]
[  0   1   2 100 100 100   6   7   8   9]

「arr2」という新しい変数に「arr」の一部を格納して編集したのに,元の「arr」というndarray配列の3, 4, 5番目のインデックスが100に代わっていることがわかります.

次に,リストでも同じ作業をしてみましょう.

data = range(10)
l = list(data)
print(l)
l_2 = l[3:6]
l_2[:] = [100, 100, 100]
print(l)

上記と同様にすると,以下のように表示されます.

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

リストの場合は,元のリストの一部を切り取り,新しく作った変数が元のリストに影響を与えていないことがわかります.

この違いは,両者のスライスが「ビュー」であるか,「コピー」であるかの違いです.
ndarray配列では,元のndarray配列をスライスしたものは「ビュー」となり,その変更は元のndarrayに反映されます.
一方,リストでは,元のリストをスライスしたものは「コピー」であり,新しくリストを生成するため,その変更は元のリストに変更を与えません.

このような理由から,上記の二つの例のようなことが起こるんですね.
「ビュー」や「コピー」といったことは,かなり出てきますが,その概念は難しいので,こんなことがあるんだくらいで覚えておきましょう.
次出てきたときに,思い出せればOKです!
プログラミングってのはそんなもんだと思います!
なので,じゃんじゃん進めていきましょう!

まとめ

今回は,ndarrayの基礎としてインデックス参照とスライシングについて紹介しました.
基本は,リストと同じ扱いかなと思います.
ただ,番外編として紹介した「ビュー」と「コピー」の違いによって少し扱いが変わってくるのも事実です.
完璧に覚えるのではなく,頭の片隅に置いておきましょう!
また,こういった知識はネットで探すより,一冊でもいいので何かしらの本を参考に進めていくと出会えます.
つか〇は,「Pythonによるデータ分析入門」を読み進め,実際にプログラムを書き,実行し,ブログで発信しています.

次の記事で,ndarrayの多次元配列におけるインデックス参照とスライスについて説明します.
少しずつPython,プログラミングに慣れて,武器を身に付けていきましょう!!

コメント

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