
「サイエンティフィックPythonのための」IDE、Spyder上にてScientific Python Lectures様のレクチャ実習中。NumPyの実習4回目です。今回は、Numpy配列の「形の変形」です。たいていの変形はできるけど、変形のときの注意点など多々あり、気をつけてやりなさい、と。誰が言った?
※「 ソフトな忘却力」投稿順 Index はこちら
※レクチャ実習中といっても、「準拠」しているのはレクチャの章立てくらいです。Scientific Python Lectures様のコースは例題だけでなく、エクササイズなども充実、それを全部順番に解いていったら必ずや立派な人になれるだろ~と思います。でもキチンとやったら、死ぬまでに終わらない、と手抜きを正当化。
配列のフラット化
まずは多次元配列を1次元にする、フラット化です。これを行う関数が2つあり。
-
- ravel()
- flatten()
「ほぐし」と「うちのばし」という感じ?結果をみるとどちらも同じに見えますが、本質は大違いだと。最後のnp.may_share_memory()の結果を御覧じろ。
ravel()は「ビュー」、flatten()は実体メモリに複製。そうだったのか。
配列のreshape
多次元配列を1次元配列にするフラット化を先にやってしまいましたが、reshape関数を使えば、1次元を多次元にするなど、形の変形(ただし要素数は同じ)はいろいろ可能みたい。こんな感じ。
上記の結果をみると、reshapeは「ビュー」みたいね。
新たな次元(newaxis)の追加
さて、前回、前々回とテクに感動してしまった、newaxisです。これを使うと配列に「新たな次元」が追加できますな。 こんな感じ。
上記では1次元のs1から、2次元のs4を作り、2次元のs0から3次元のs5を作り、再び1次元のs1から、2次元のs6を作ってます。生成した配列共の shape を確認してみるとこんな感じ。
2次元のs4とs6は、「新軸」の位置が違うけれど、3次元の配列は新軸の入れ方が1種類しかないじゃん。他の入れ方も確認しないと、ということでやってみたのが以下に。
合計3通りの「新軸」設定方法を網羅。網羅というほどのもんでもないか。
resize
前出のフラット化やreshapeは、メモリ上での配列が占める大きさは変化しませんでした。しかし、resizeは違います。大きさから変わるっと。そのうえインプレースでの処理があるので注意っと。
緑のs1は「ビュー」で、実体メモリはs0が持っているので、お前はresizeなどできんと拒絶?されているみたい。s2は実体メモリは持っている筈なのだけれど、s2を参照しているヒト(s3)などがあるのでダメみたい。
そこでnp.resize()関数で、新たなメモリを割り当てる形でs2をリサイズしてみたものが以下に。
なお、「配列.resize()」の形であると、以下のように「インプレース」で配列の大きさを拡張してくれるみたい(実際にはコピーしている?知らんけど。)
まあ、使えるけど、慌て者の老人は注意した方が良い感じっす。まあ、いろいろ五月蠅く言われるのでマズイときには気づくか。どうなんだ。