« 今から始めるPython その6 numpyの基本 スライシングの続き | トップページ | 建築学の学位をもつイラン人女性歌手タラ・ティバさんがめちゃ巧い件 »

2014年10月 4日 (土)

今から始めるPython その7 numpyの基本 最終回

Numpy_logo1

J.R. Johanssonさんが作ったiPython notebookによるNumpy入門に便乗しながらNumpyの基本について2回にわたって解説してきましたが、今回でNumpyの基本は最終回です。

Calculations with higher-dimensional data

なんか先走って前回に上の方でmeanを例にやってしまいましたが、同じことです。min, max, stdなどなどaxisを指定できる関数は沢山あります。

Reshaping, resizing and stacking arrays

見たままでオーケーです。

Adding a new dimension: newaxis

これは、結構重要で、よく使います。ここで示されている例はイマイチ実用的じゃないかなと思いますので、前に自分のブログに書いたアホな記事(英語でメモってGoogle translateで日本語に直訳して書いた。)の焼き直しをしてみます。

MATLABで

a = round(rand(4,5)*10)

 4     6     5     2     3
 9     6     2     2     9
 9     2     8     2     4
 6     3     2     4     2

なんて感じの二次元配列があって、これと同じコピーを3つ目の次元にもう一つ作りたい場合

b = repmat(a,[1,1,2])

なんて風にしてやると

b(:,:,1) =

 4     6     5     2     3
 9     6     2     2     9
 9     2     8     2     4
 6     3     2     4     2

b(:,:,2) =

 4     6     5     2     3
 9     6     2     2     9
 9     2     8     2     4
 6     3     2     4     2

これをNumpyでやろうとすると

b = np.tile(a[:,:,np.newaxis], (1,1,2))

という感じになります。MATLABは自動でやってくれるんですが、Numpyではnewaxisでもって、増やす次元を指定してやります。

Stacking and repeating arrays

また先走ってしまったようです。tileは上でやってしまいましたね。 concatenateはまあ使いますが、同じことをするなら、自分の場合それよりもhstackとvstackの方が登場回数が多いです。ここには書いてませんがdstackというのもあります。vはverticalのことだと思いますが、Numpyの場合最初の次元は縦方向に向かいますので、最初の次元でスタックしたい場合、vstackになります。で、hstackのhは横方向になりますが、想像の通りhorizontalだと思います。で、dstackはなんだろう?とおもって調べてみたらdepthのことでした。納得。つまり3つ目の次元でスタックします。

Copy and "deep copy"

ここは重要です。MATLABに慣れているとA=BとしたらAにはBがコピーされる訳ですが、NumpyというかPythonではコピーではなくてリファレンスされます。もっというとMATLABの場合、メモリがコピーされてメモリ上に2つ同じものが存在しますが、Pythonの場合はA=Bのように書いた場合、AにはBの内容が入っているメモリの場所を示すものになって、Bの内容はそのままでメモリ上のBの内容をBと呼んでもAと呼んでもよいという感じになります。アダ名を付けた見たいな感じです。これによってメモリへのアクセスを抑えて実行速度を上げることが出来ますが、AもBもメモリをシャアしているので、Bを変えるとAも変わり、Aを変えるとBも変わってしまってそれでは困ることもあるわけです。そういう場合は、ちゃんとメモリ上に2つ同じものがあるようにコピーしてやらなくてはならないんですが、そういうコピーのことをdeep copyといいます。それ以外のアダ名を付けるようなコピーはshallow copyといいます。深い⇔浅いという対応ですね。

まとめるとshallow copyはリファレンスによるコピーで、メモリ上の同じものを指しているだけで、deep copyではメモリ上に同じものができるちょっと時間のかかるコピーです。

これはPythonのリストでも全く同じことが起こります。

A = [1,2,3]

B = A

B[0] = 100

とするとA[0]も100になります。

これを避けるには、私の場合

B = list(A)

として、listで新しいリストを作ると明示的に宣言することでBはAの内容だけど新しいリストができるようにします。

Numpyにはnp.copyというのもあるので、AがNumpyアレイの場合

B = np.copy(A)

という風にも出来ます。Pythonにはスタンダードライブラリにcopyというのがあって、

copy.deepcopy(x)

みたいにディープコピーもできますが、面倒いので私の場合はリストならlist、タプルならtuple、ディクショナリならdictで再キャストする感じでディープコピーをしてしまいます。

Numpyアレイなら

B = np.array(A)

としてディープコピーができます。

まあなんでこんな面倒な区別をしないといけないのかという気もするかもしれませんが、MATLABみたいにとにかくコピーが出来まくるのがデフォルトの仕様で初心者が使いやすいのがいいのか、コピーするときは意識してするような中級・上級者むけな仕様がいいのかは意見の別れるところかもしれません。メモリの節約を普段から気にするのは長い目で見るといいことだと思うので、この際積極的にメモリのことを意識しながらプログラムをするきっかけにしてしまうといいと思います。

Iterating over array elements

まあ、ここでもNumpyアレイはイテレーションできるけども、できるだけ避けるべきとはっきり書いてありますが、その通りです。

実際に小さなアレイをリストコンプリヘンションに使うような場合を除いて、私もイテレーションしたことはありません。まあ、一応できるんだなぁ程度に覚えておけばいいと思います。

Vectorizing functions

vectorizeですか。こんなの、あったのかという感じで、知りませんでした。 どちらかというと、Pythonのmapを使ったりしてました。

Using arrays in conditions

anyとallですね。これは便利でよく使っています。括弧の中で==や>、<をつかって比較をすると結果はTrueかFalseかのバイナリ値のアレイがかえってきます。その中で一つでもTrueが有れば良い場合、anyを使い、全部Trueじゃないとダメな場合allを使うという感じです。

Type casting

これがこのタイミングできましたか、dtypeは結構パフォーマンスに大事な概念なのでしっかりと覚えましょう。

ここにはありませんが、Numpyアレイを作るときに、dtypeを指定できることは重要です。

a = np.array([1,3,6])

としてみるとデフォルトではint32の整数型としてアレイが出来ます。一つの要素に32ビットのメモリを使うわけですね。aには0から255までの整数しか無いと分かっている場合、例えば8ビットのグレースケールの画像データをNumpyアレイに読み込んだりした場合、Numpyアレイのデータタイプはnp.uint8になっているべきです。その場合、dtypeオプションでもって

a = np.array([1,3,6], dtype=np.uint8)

というようにするとint32に比べてメモリを1/4に抑えられて、最小限のメモリをつかってアレイを表現できるので、実行速度が速くなります。

uint8と言うのはアンサインド・インテジャーの8ビットで、0-255までの範囲を表すのに最適化されたデータタイプです。

ただ255を超えると値がオーバーフローして0にもどってしまうので気をつけましょう。引き算も0以下になると255の方に突然ジャンプしたり、割り算も答えが整数だし、np.uint8を使う時はいろいろと制限があって気を使いますが、パフォーマンスが上がるので使える時には積極的に使いましょう。

さて、こんな感じで一応最後まで来ました。Numpyについてグチグチといろいろとうんちくを垂れてました。まだまだ、言い足りませんが又の機会ということで、今日はこの辺でおしまいです。

 

« 今から始めるPython その6 numpyの基本 スライシングの続き | トップページ | 建築学の学位をもつイラン人女性歌手タラ・ティバさんがめちゃ巧い件 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1169291/57569013

この記事へのトラックバック一覧です: 今から始めるPython その7 numpyの基本 最終回:

« 今から始めるPython その6 numpyの基本 スライシングの続き | トップページ | 建築学の学位をもつイラン人女性歌手タラ・ティバさんがめちゃ巧い件 »

広告欄


やっつけタイムライン

広告欄

はてブ

人目の訪問です。

  • follow us in feedly

    かなり更新が不定期なため、RSSリーダーをオススメします。現在Feedlyに122人登録頂いています。多謝!RSSを表示

    ブログランキング用 にほんブログ村 IT技術ブログ Pythonへ ブログランキングならblogram






    Jenny Mayhem
2017年7月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          

IT技術注目記事

無料ブログはココログ