路傍のプログラマ

只のプログラマが綴る愚痴と備忘録

numpy

2009-01-29 19:19:15 | プログラミング
多次元空間のベクトルの距離を求める必要が出てきたので、

(難解だったらすいません、要は、浮動小数のタプルだかリストだかが2つ与えられたときに、その要素それぞれについて引き算して2乗したものを合計する、というやつです)

餅は餅屋、数学は数学ライブラリ、ということで、numpyを試してみました。
(numpyは2.6には未対応とのことで、今回はPython 2.5を使ってます)

2つのベクトルをa, bとすると、

普通にPythonで書くと、aやbはタプルかリストかになって、距離の計算は

d2 = sum(pow(x - y, 2) for x, y in zip(a, b))

となります(厳密には距離の2乗ですが)。

numpyを使えば、aやbはnumpy.arrayになって、numpy.array同士の演算などが定義されているので、距離の計算は、

d2 = numpy.power(a - b, 2).sum()

でできます。(ひょっとするともっと速いやり方があるかもしれませんけれども)。

実測してみると、ベクトルの要素数が小さいときは普通のPythonの方が速いのですが、ベクトルの要素数が20を超えるあたりで逆転します
(Psycoつけてもほぼ同様の結果でした)。

結論。

numpyは役に立ちそうです。パフォーマンスも上がるし、ソースコードもすっきりするし。使えるところにはどんどん使っていこうと思います。

ライセンスはBSDかMITっぽい(詳細はnumpy-1.2.1.tar.gzのLICENSE.txtを参照ください)ので、その辺はご注意ください。