Pythonのスプライン補間はscipyのInterpolatedUnivariateSpline
1000ノット以上のデータを補完しようとしてメモリ不足になる場合は、numpyのinterp1dではなく、scipy.interpolate.InterpolatedUnivariateSpline(x,y,k)
を使いましょう。
たとえば
1
2
3
4
5
# モジュールの読み込み
from scipy.interpolate import InterpolatedUnivariateSpline
# スプライン補間関数を計算
f = InterpolatedUnivariateSpline(x,y,k=3)
という感じ。
「numpy スプライン補間」で検索すると、10点くらいのデータ点をサンプルに示して、interp1dを使えと書いてある記事が散見されます。これだと10万以上のノット数ではうまくいきません。Python 2系列でしか試せていないのですが、interp1dだと10万ノットで10GBを超えるようなメモリを確保しようとして、プログラムが応答しなくなります。InterpolatedUnivariateSplineだとすぐ完了します。日本語で検索しても同じ症状で困っている人がすぐに見つかりませんでしたが、英語だとStack Overflowで「Cubic spline memory errorCubic spline memory error」という記事があって、InterpolatedUnivariateSpline
を使え、と書かれています。
Pythonを使い始めました
それにしても、RubyROOTやRubyFitsを使って、なるべくデータ解析もRubyで完結させるようにこだわってやってきましたが、会社ではPythonがスタンダードで、そうも言っていられなくなってきたので、いよいよPython (numpy/matplotlib)も使うことになりました。Jupyter便利ですね。
gistでJupyterのnotebookを共有しましょう
最近会社の人から教えてもらったのですが、gistでは2015年5月からJupyterのnotebookの見た目をたもったもったままレンダリングしてくれるようになっています(プロットもインラインで表示されます)。チームの人と解析結果を共有するのも簡単ですね。
[tmkm-amazon]4873116554[/tmkm-amazon]