
「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lectures様のレクチャ実習中。前回につづきNumPyの実習です。今回はアリガチな配列の「スライス」のお勉強と思ったら、素人老人は知らないテクを御披露。NumPyプロの姉貴兄貴は知ってるに違いないが。
※「 ソフトな忘却力」投稿順 Index はこちら
配列の一部を取り出すスライスでしょ
知ってるよ、「配列の一部を取り出すスライスでしょ」とシッタカブリのお惚け老人です。レクチャの例に最初から躓きました。
あれあれ、一撃で逆順に要素を取り出せていますな。こういう「初歩」のところからお惚け老人抜けておると。当然、0:9:2とすれば、偶数要素だけを取り出せてます。ハイ。
2次元配列を生成するTips、カッケー
さて、見やれば、以下のようなNumPy配列間の「+」演算を使った技も披露されてました。
一撃で上記のような配列になっちゃうのね。言われてみればそういう気がしないでもないけれど、お惚け老人には考え付かない技だよ。
NumPy配列のメモリ・シェアを確かめる方法
そして
スライスはビューである
とのお言葉。ぶっちゃけ、NumPy配列の各要素はメモリブロックの隣り合ったところに連続配置されており、スライスはこれに別な「ビュー」(実態のメモリ配列は同じ)を与えるもんだと。
実体配列のメモリが「シェア」されているか否かを確認するために
may_share_memory
というメソッドが用意されているので、確認したければそれ使えと。こんな感じ。
確かに、「単なるスライス」はメモリをシェアしているみたい(上の方)、一方、copy()すれば、当然、シェアされておらんと(下の方。)
Fancy indexing
何やらFancyなインデックスもあり。これは上記のようなスライスでインデックスするものにあらず、ブーリアンか整数配列で「マスク」を与えて、要素を取り出すものみたい。こちらはインデックスとは異なり、ビューではなく要素のコピーで新たに生成されるみたい。
黄色のマーカのところは、3で割り切れる要素のところにTrue、そうでないところがFalseの配列デス。すると確かに取り出せる、そして、メモリはシェアされていないっと。
たかがスライス、されどスライス、誰が言った?