ソフトな忘却力(78) みんな大好きNumPyのsliceのお勉強

Joseph Halfmoon

「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lectures様のレクチャ実習中。前回につづきNumPyの実習です。今回はアリガチな配列の「スライス」のお勉強と思ったら、素人老人は知らないテクを御披露。NumPyプロの姉貴兄貴は知ってるに違いないが。

※「 ソフトな忘却力」投稿順 Index はこちら

配列の一部を取り出すスライスでしょ

知ってるよ、「配列の一部を取り出すスライスでしょ」とシッタカブリのお惚け老人です。レクチャの例に最初から躓きました。

「::-1」とは何ぞ? こんな感じ。NumpySliceTips1

あれあれ、一撃で逆順に要素を取り出せていますな。こういう「初歩」のところからお惚け老人抜けておると。当然、0:9:2とすれば、偶数要素だけを取り出せてます。ハイ。

2次元配列を生成するTips、カッケー

さて、見やれば、以下のようなNumPy配列間の「+」演算を使った技も披露されてました。NumpySliceTips2
一撃で上記のような配列になっちゃうのね。言われてみればそういう気がしないでもないけれど、お惚け老人には考え付かない技だよ。

NumPy配列のメモリ・シェアを確かめる方法

そして

スライスはビューである

とのお言葉。ぶっちゃけ、NumPy配列の各要素はメモリブロックの隣り合ったところに連続配置されており、スライスはこれに別な「ビュー」(実態のメモリ配列は同じ)を与えるもんだと。

実体配列のメモリが「シェア」されているか否かを確認するために

may_share_memory

というメソッドが用意されているので、確認したければそれ使えと。こんな感じ。NumpySliceTips3

確かに、「単なるスライス」はメモリをシェアしているみたい(上の方)、一方、copy()すれば、当然、シェアされておらんと(下の方。)

Fancy indexing

何やらFancyなインデックスもあり。これは上記のようなスライスでインデックスするものにあらず、ブーリアンか整数配列で「マスク」を与えて、要素を取り出すものみたい。こちらはインデックスとは異なり、ビューではなく要素のコピーで新たに生成されるみたい。NumpySliceTips4

黄色のマーカのところは、3で割り切れる要素のところにTrue、そうでないところがFalseの配列デス。すると確かに取り出せる、そして、メモリはシェアされていないっと。

たかがスライス、されどスライス、誰が言った?

ソフトな忘却力(77) Spyder IDE でみんな大好きNumPyを復習する へ戻る

ソフトな忘却力(79) みんな大好きNumPyの演算子のお勉強 へ進む