Hatena2011-11-02
code:hatena
<body>
*1320221317*NumPyで散布図を書く
NumPy + Matplotlibの環境構築がうまく行かなくてほったらかしにしていたのだけどいい加減ほったらかしにしてられなくなってきたので「明確な目標を立ててそれの達成のために必要最小限だけタイムトライアルで学ぶ」というアプローチで頑張ってみた。
ndarrayはmatrixの親クラスで、N-dimension array。arrayで作る。import *とか、何がどこからきたかわかりにくくなるから嫌いなんだけどとりあえず従っておく。
|python|
In 1: from numpy import * ||<
N次元の配列ということで、Pythonの普通のシーケンス型がxs3で値を取れるように、xs3, 3で値を取れるように拡張されている。そしてxs:ができるのと同様にxs:, :もvalid。面白い。 とりあえずベクトル演算とか試そうと思って array(1, 2, 3).transpose() したら期待と違って変化せず。 |python|
||<
これはx.shapeを見れば理由がわかる。行列が2次元の構造でベクトルは1次元の構造だ、と思ったら間違いで、ベクトルに縦ベクトルと横ベクトルの2種類があるってのはやはりそれが2次元の構造だからなんだな。というわけで(3,)って1次元の構造だったのを(1, 3)にreshapeしたら期待通りの挙動をするようになった。
||
||<
matrixを使えば解決なんだけどmatrixには罠がいっぱいあるという噂なので避けてみた。罠って具体的になんなんだろうね。ここらへんはc_とかr_とかで楽になるのかな。
|python|
||<
arrayとスカラーで演算をするとスカラーがarrayの要素それぞれに対してブロードキャストされる。arrayの添字にはarrayを渡すこともできて、intのarrayならその添え字が選択され、boolのarrayならTrueの所が選択される。そしてそれに対して破壊的代入もできる。クール。
|python|
||<
x.view()がシャローコピー、x.copy()がディープコピー。
max, min, sumがある。cov, mean, std, varがある。svdもある。楽チン。
||
In 27: from pylab import * In 28: scatter(randn(100), randn(100)) Out28: <matplotlib.collections.CircleCollection at 0x103fabe90> ||<
||
In 31: matplotlib.pyplot.savefig('test.png') ||<
できたできた。ちなみにいい忘れたけども僕の環境はMacOSX 10.6.8で、openはMacOSXのコマンド。ファイルを適当なアプリで開いてくれる。僕の場合プレビューが開く。で、プレビューは開いているファイルが変更された場合自動的に再読み込みをしてくれる。ん、じゃあshow()動かなくてもたいして困らないか。
ここでパラメータを変えてグラフを描き直してみたくなると思うんだけど、このまま描き直しても前のグラフに追記されてしまう。対話的にいろいろ試したいならグラフを消して書きなおす関数がclf()なのを覚えておく必要がある。 (clear figureの略だろうな)
まとめ
||
In 1: from numpy import * In 27: from pylab import * In 28: scatter(randn(100), randn(100)) Out28: <matplotlib.collections.CircleCollection at 0x103fabe90> In 31: matplotlib.pyplot.savefig('test.png') # パラメータを変えて描き直してみる
In 40: data = data.dot(array(1, 1], [0, 1)) # 斜めにしてみる Out42: <matplotlib.collections.CircleCollection at 0x104411290> In 43: matplotlib.pyplot.savefig('test.png') ||<
追記: scatterのオプション引数でmarker="+"とかできるの書き忘れた
追記: alpha=0.5を指定するとかっこいい
*1320222463*ipythonとpdbの組み合わせで人生を楽にする方法
予期しない例外が起きた場合:
||
---------------------------------------------------------------------------
(中略)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.pyc in scatter(self, x, y, s, c, marker, cmap, norm, vmin, vmax, alpha, linewidths, faceted, verts, **kwargs)
5736 sym = syms.get(marker)
5737 if sym is None and verts is None:
-> 5738 raise ValueError('Unknown marker symbol to scatter')
5739 numsides, rotation, symstyle = symsmarker 5740
ValueError: Unknown marker symbol to scatter
||<
||
Automatic pdb calling has been turned ON
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes.py(5738)scatter()
5737 if sym is None and verts is None:
-> 5738 raise ValueError('Unknown marker symbol to scatter')
5739 numsides, rotation, symstyle = symsmarker ipdb> syms
{'x': (4, 0.7853981633974483, 2), '^': (3, 0, 0), 'd': (4, 0, 0), 'h': (6, 0, 0), '+': (4, 0, 2), 'o': (0, 0, 3), 'p': (5, 0, 0), 's': (4, 0.7853981633974483, 0), 'v': (3, 3.141592653589793, 0), '8': (8, 0, 0), '<': (3, 4.71238898038469, 0), '>': (3, 1.5707963267948966, 0)}
||<
うーん、少ない。三角形を4種類も入れなくていいから点を入れといて欲しかったなぁ。
ちなみにpdbモードはqで抜けられて、もう一回pdbって打つとAuto-pdbはOFFになる。
さらにちなみに「なんだよどこに使えるシンボルの一覧があるんだよ」に関してはhelp(scatter)したら書いてあったゴメンナサイ。
</body>