Python,NumPyの基礎③ ~ndarray多次元配列のインデックス参照とスライス~

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

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

ndarrayでの多次元配列における,インデックス参照とスライスについて紹介します.
恥ずかしながら,つか〇は,多次元配列でどうやってインデックス参照するんや?スライスはどうするの?っていうところから始まってます.

そんな,初心者の方でも,もちろん復習としても,わかりやすく説明していこうと思います.
インデックス参照とスライスについての基礎は,「Python,NumPyの基礎② ~インデックス参照とスライシング~」で説明していますので,ぜひ参考にしてください.

多次元配列の生成

多次元配列とは,一次元配列と異なり,多次元です.

・・・

見ていきましょう.

まず,一次元配列は,以下のような配列です(Python,NumPyの基礎② ~インデックス参照とスライシング~で用いた配列と同様です).

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

ここで,インデックス参照で配列の中身を取り出すと,

print(arr[2])
type(arr[2])
6
numpy.int32

このように,要素を取り出すことができます.
また,取り出した要素の型は,整数型であることがわかります.
(型については,一旦調べてください(笑).またの機会説明したいと思います.)
このような数値は,スカラー値と呼ばれています.

図で示すと,下図のようなイメージです.
ここまでは,Python,NumPyの基礎② ~インデックス参照とスライシング~と同じですね.

次に,2次元配列について見ていきましょう.
下記のように3×3の配列を生成します.

import numpy as np
arr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2)

以下のような,3行3列の配列が作成されます.

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

この配列について,一次元配列と同様にインデックスを参照してみましょう.

print(arr2[1])
type(arr2[1])
[4 5 6]
numpy.ndarray

上記のように一次元配列と同様な表記をすると,ndarray配列で取り出されていることがわかります.

では,どうやってスカラー値の要素を取り出すかというと,下記の二つの方法でできます.

print("arr2[1, 2] = ", arr2[1, 2])
print("arr2[1][2] = ", arr2[1][2])
arr2[1, 2] =  6
arr2[1][2] =  6

どちらもスカラー値で「6」を抽出できました.
(ちょっと出力を格好つけてみました!(笑).)

次元が増えても,このように増やしていけば狙った要素をスカラー値で取り出すことができます.
たとえ3次元配列でも以下のようにすれば,要素を取り出せます.

arr3 = np.array([[[1, 2, 3], [4, 5, 6]], [[11, 22, 33], [44, 55, 66]]])
print("arr3[0, 1, 2] = ", arr3[0, 1, 2])
arr3[0, 1, 2] =  6

3次元配列をイメージすると以下のような感じですかね.
(わかりにくかったら飛ばしてください.
 軸というのは,インデックスと思ってください.)

このようにインデックスを増やしていけば,多次元配列でも要素を取り出すことができます.

多次元配列のスライスによるインデックス参照

まず,一次元配列を思い出しましょう.

import numpy as np
arr = np.array([2, 4, 6, 8, 10, 12])
print(arr[1:5])

とすると,以下のように連続したインデックスに格納されている要素が取り出されます.

[ 4  6  8 10]

リストと同じですね.
では,三次元配列について見てみましょう.
以下のような配列に対して,様々に取り出してみます.

arr3 = np.array([[[1, 2, 3], [4, 5, 6]], [[11, 22, 33], [44, 55, 66]], [[7, 8, 9], [77, 88, 99]]])
print("arr3[:2] = ", arr3[:2])
print("arr3[:2, :1] = ", arr3[:2, :1])
print("arr3[:, 1, 0] = ", arr3[:, 1, 0])

すると,以下のような出力がされます.

arr3[:2] =  [[[ 1  2  3]
  [ 4  5  6]]

 [[11 22 33]
  [44 55 66]]]
arr3[:2, :1] =  [[[ 1  2  3]]

 [[11 22 33]]]
arr3[:, 1, 0] =  [ 4 44 77]

言葉で説明するのは難しいので,ここはトレーニングを兼ねて自ら考えてみましょう!!
前項の三次元配列のイメージ図を参考にしてもらえるとわかりやすいかもしれません.
(説明が面倒なだけです(笑).)

実際,模写をすることでもプログラミングは学ぶことができますが,つか〇的に模写で出力する前に結果を予想してみるのが大事だと思います.
思った通りに動けば認識が合っているし,予想外なら記憶に理由を理解して記憶に留めておけばいいと思います.
そうすれば,実践で0から書くときとか早くなりそうですしね.

頭の体操にもなるので,予想しながら学習していきましょう!!

まとめ

前回を含めて,ndarrayでのインデックス参照とスライスの基礎について学んでいきました.
おそらくここまででできていれば,狙った要素は取り出せると思います.

NumPyの基礎④ ~ndarrayにおけるブールインデックス参照~」で真偽値を使ったブールインデックス参照を紹介しています!
ぜひ参考にしてください.

「は?」

ですよね.
わかりやすく説明していくので,少々お待ちください。

また,以下の書籍からの学びをかみ砕いてますので,ぜひ参考にしてください.

一緒に楽しく,Pythonを学んでいきましょう!!

コメント

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