忍者ブログ

Py淡 (PyTan)

Home > ブログ > Python

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Numpy: NaNをリニアインターポレーションして置き換える

def interp_nan(x):
    '''
    Replace nan by interporation
    http://stackoverflow.com/questions/6518811/interpolate-nan-values-in-a-numpy-array
    '''
    ok = -np.isnan(x)
    xp = ok.nonzero()[0]
    fp = x[ok]
    _x = np.isnan(x).nonzero()[0]
    x[-ok] = np.interp(_x, xp, fp)
    
    return x

Site-packagesに入れていつでもインポートできるようにしておくと便利なスニペット。もともとはStackoverflowで見つけたものほぼそのまま。ravelが何で入れてあるのかコメントで突っ込まれていて、確かになくとも動くのでとっておいた。

いつもと違うPCなんかでコーディングするときようの覚書。Pygmentsにもあげておいた。

使用例

>>> toy = np.array([np.nan, 1, np.nan, 3, np.nan, 9, np.nan, 2, np.nan])
>>> interp_nan(toy)
0: array([ 1. ,  1. ,  2. ,  3. ,  6. ,  9. ,  5.5,  2. ,  2. ])
PR

np.ones_like, np.zeros_likeでboolアレイの初期化。

覚書です。

array1 = np.zeros((w,h))

なんかであらかじめプリアロケーションしたゼロ行列を作ることはよくありますが、ブーリアンのときはどうやるとスマートなのかと思って調べました。

bool値で満たされた行列の初期化

私の場合、既にあるmyarrayと同じ次元のマスクが欲しい時は

mask = np.ones(myarray.shape, dtype=np.bool) * False

でFalseの部分を必要に応じて変えて急場をしのいでましたが、

どうせmyarray.shapeってやるならnp.ones_likeをつかって

mask = np.ones_like(myarray, dtype=np.bool) * False

と書くべきだし、ones_likeだとTrueの行列になるので

mask = np.zeros_like(myarray, dtype=np.bool)

がスマートな方法っぽい。

boolに限らずもっと一般的な方法としてはあまり使ったことなかったけどnp.full_likeというのがあって、第二引数の値で満たされた行列を作れる。

mask = np.full_like(myarray, Flase, dtype=np.bool)

または

mask = np.full_like(myarray, True, dtype=np.bool)

nanで満たされた行列の初期化


np.full_likeを使うとnanで満たされた行列の初期化がスマートになります。

mask = np.full_like(myarray, np.nan)

でいけます。いままではnp.onesにnp.nanをかけていたけどこっちのほうがスマートですね。

np.emptyはいつ使うのか

np.zerosに似たnp.emptyは初期化しないでメモリだけ確保するので、次元とデータ型は正しいが、確保されたメモリに残っているめちゃめちゃな値の行列ができる。全要素を上書きするのが確定している場合にはいいけど、忘れそうで危険なので使わないことにしている。そこまでパフォーマンスにこだわる状況っていまのところあまりない。

matplotlibの図をBMPとしてクリップボードにコピーする関数作った。

よくデータ解析しているとmatplotlibでfigure(facecolor='w')にしてプロットした図をウィンドウズのSnipping toolでクリップボードにコピーして、パワーポイントに貼って、ノーテーションしたりするわけですが、これが何度も続くと面倒い。

ぐぐってみたらwxのバックエンドではツールバーにクリップボードにコピーするアイコンを追加するハックがあった。残念ながらこのパッチはマージされなかったようで、1.4.2でもクリップボードにコピーできない。

で、やっぱり自分で作る。

matplotlibのデフォルトのバックエンドはいまQt4Aggだと思うのでQtでやるにはどうしたら良いのかなとぐぐってみたら、こんな質問があって、もしウィンドウズならwin32clipboardつかってみたら?という回答があったのでやってみた。

使い方

なんかmatplotlibでプロットしたらこの関数を引数なしでcopy2clipboard()としてやれば現在フォーカスがある図をBMPとしてクリップボードにコピーします。もしくはfigのインスタンスをfig=figure()のようにして取得してからプロットして、copy2clipboard(fig)のように使います。エディターにプロット用のスクリプトがあってなんどもプロットする場合、tight_layout()とかの後にこの関数を置いておくと一手間省けるという感じです。力技ですが、一応つかえます。


"import antigravity" actually works!

Wow. I did not expect it to work but I just tried it for fun. And guess what! It actually works!

Fire up your python console and try importing "antigravity". It brings you to that xkcd page http://www.xkcd.com/353/.

The history behind how this made into python by Guido can be found here: http://python-history.blogspot.ch/2010/06/import-antigravity.html




あ゛ーびっくりした。さっきこのブログのサブタイトルに”In the spirit of import antigravity”と追加したので、なんとなく試しにインポートしてみてみたらウェブブラウザが開いてあのページが出てきた。面白いのでみなさんもお試しあれ。

もともとはグーグルアプエンジンのイースターエッグ

これだけではなんなのでちょっとググってみたら、The history of antigravityというブログに記事があって、
But it really originated in Google App Engine! It was a last-minute addition when we launched App Engine on April 7, 2008. A few weeks before launch, when most code was already frozen, the App Engine team at Google decided we wanted an easter egg.

なんて書いてある。つまりもともとは2008の4月7日にGoogleのAppEngineがランチしたときに公開されたGAEのイースターエッグとして追加されたモジュールだったようです。それがPython3にマージされて、Python2系にも降りてきたらしい。

ちなみにこの記事はGuido van Rossum本人の書き込みだった。彼がグーグルにいた時の逸話でしょうか。