多次元空間のベクトルの距離を求める必要が出てきたので、
(難解だったらすいません、要は、浮動小数のタプルだかリストだかが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を参照ください)ので、その辺はご注意ください。
(難解だったらすいません、要は、浮動小数のタプルだかリストだかが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を参照ください)ので、その辺はご注意ください。