データサイエンスのためのPython入門⑦〜これだけ知っておけばいいNumPyのindexingとslicing〜

AI開発者・データサイエンティストを目指す人向け
おすすめUdemy講座一覧

こんにちは,米国データサイエンティストのかめ(@usdatascientist)です.

データサイエンスのためのPython入門第7回です(講座の目次はこちら).今回は前回の記事で紹介したNumPyのindexingslicingについて重要なところを中心に解説したいと思います.

indexingというのは,array_obj[5]のようにarrayの特定のindexの値をとってくる操作です.

slicingというのは,第3回の記事で説明したとおり,array_obj[3:5]のようにコロン(:)を使って値をとってくる操作です.

NumPy Arraysのもっとも重要な操作です.超重要.むしろこれさえちゃんと押さえておけばもう他のNumPyの記事は軽く呼び飛ばしていただいても構わないと言ってもいいくらいです.

indexingとslicingはデータサイエンスに欠かせない操作

実業務では,ぶっちゃけ行列演算ってそんなにしないです.自分で数式を作って生のデータをそれにぶっこむときや,例えば深層学習の中間層に自分で行列演算の式を書くときがありますが,そういうときはNumPyではなくてNumPyを内部で使ってる別のパッケージを使ったりします.

知っておく必要はあると思います.今後紹介する様々な機械学習のパッケージは内部でNumPyを使っていて行列演算処理をしているからです.しかし,それを業務で自分でやる場面は少ないと思います.

NumPyの操作で圧倒的に多いのはこのIndexingSlicingです.さらにいうとslicingが多いです.

データサイエンスって大量のデータを使うので,ある特定のデータをとってきたいケースが多いです.例えば全ての列の先頭の値だけ,とかソートして後ろから10個全部とか.

もし画像を扱うのであれば特定の座標のピクセル値をとるのにもNumPyのIndexingやSlicingを使います

とりわけ重要操作なので今回の記事でちゃんと存在をしり,必要になったときに「そういえばこれ,Slicing使ってできるな」と思い出して調べられるようにしましょう.

知らないと無駄にforとかで回して苦労することになりますので.

Indexing

いままで,リストやarrayから値を取り出すのに array[整数] で値をとっていました.indexは0から始まり,index-1番目の値がとってこれます.

indexに負の値を入れた場合,後ろから値をとってきます.フルーツのリストで考えるとこんな感じ↓,

チェリーをとってきたければindex=2かindex=-2でとってこれます.

一番後ろが-1からはじまることに慣れない人は以下のように考えるといいかもしれません.ループのように,index0の前はリストの最後(-1)がくるイメージです.

ゲーム画面でずっと左に行くと右端から帰ってくる感じです.ボンバーマンみたいに(わかりにくいかw)

一列の場合はこれでいいんですが,NumPy Arrayのように行列になると厄介です.ちなみに,N次元Arrayのことをndarrayと呼びます.(N-dimentional array)

Pythonのリストで入れ子担っている場合,[1個目のindex][2個目のindex]と言った具合で[]を後ろに繋げて要素を取れることを第3回で説明しました. NumPy Arrayでは,同様に繋げることもできますが,[1個目のindex, 2個目のindex]のようにコンマで繋げるのが一般的です.

2次元であれば視覚的に「行列」になっているので,[行, 列]と覚えておきましょう.画像処理でよく使います.3次元以降になる場合はわけわからなくなるので,一つ一つ紐どいて理解するのがいいと思います.

入れ子にしすぎると誰も理解できなくなるので,使ったとしても4次元くらいまでにし,必ずコメントを書きましょう.例えば3次元なら(height, width, channel)のようにコメントを書いておき,どこの要素にindexすればどの情報が得られるのかわかるようにします.

一般的に白黒画像なら(height, width),カラー画像なら(height, width, channel)になるので覚えておきましょう.(channelというのはRed, Green,Blueのようなそれぞれの色のチャネルです.画像についてはまた別途連載しようと思ってます.)

Slicing(重要)

こっちの方が重要です.かっこの中にコロン( : )を入れて要素を複数取り出します.

上の図をみていただいたら感覚的にわかると思いますが,[N:M]としたとき,indexが「N以上M未満」の要素をとってきます.NもMも省略可能で,Nが省略されている場合は「最初の要素以上」Mが省略されている場合は「最後の要素以下」になります.

例えば画像のndarrayを扱うとき,右半分だけ表示するときは[:, 2/width:]とslicingすると右半分になります.下の例をみて理解しましょう.

説明するより,図式を見た方がよっぽどわかりやすいですよね?プログラミング全般に言えることですが,特にこのndarrayのslicing操作は,理屈よりイメージです.色々試して結果がどうなるか確認することでだんだんとわかってくると思います.

ちなみに,[N:M:L]とするとL-1飛びでslicingできます.あまり使いませんが念の為

まとめ

とにかく自分で色々ndarray作って,どうindexing, slicingしたらどの要素がとれるのか実際にやってみてください!

他にもややこしいslicingのルールが存在しますが,本当にややこしすぎてコードを書いている人も理解しにくいものが多く,可読性が低くなるのであまり好まれません.上記に説明した内容以外のテクニックは使わなくていいと思います.

書いててちょっとわかりにくいなと思ったら,わかりやすいように工夫しましょう.分割して次元数を下げるとか,コメントに例を書くとか.

次回もまだNumPyが続きます!それでは!

次回の記事書きました↓

データサイエンスのためのPython入門⑧〜NumPyでよく使う行列生成〜

ABOUTこの記事をかいた人

かめ@米国データサイエンティスト

アメリカの企業でデータサイエンティストしてます.専門はコンピュータビジョンで,人工知能の製品を開発中. アメリカからデータサイエンス全般をゆるーく配信中