2016-12-10 4 views
1

靴ひもで面積ポリゴンを計算する関数を作った。靴ひも式への最速の方法

これは完全に機能しますが、今は同じ結果を得るためのより速い方法がないのだろうかと思います。 私はこの機能が多くの座標を持つポリゴンでより速く動作する必要があることを知りたいと思います。

My機能:

def shoelace_formula(polygonBoundary, absoluteValue = True): 
    nbCoordinates = len(polygonBoundary) 
    nbSegment = nbCoordinates - 1 

    l = [(polygonBoundary[i+1][0] - polygonBoundary[i][0]) * (polygonBoundary[i+1][1] + polygonBoundary[i][1]) for i in xrange(nbSegment)] 

    if absoluteValue: 
     return abs(sum(l)/2.) 
    else: 
     return sum(l)/2. 

マイポリゴン:

polygonBoundary = ((5, 0), (6, 4), (4, 5), (1, 5), (1, 0)) 

結果:

22. 

任意のアイデアは?

私はNumpyで試してみます: これは最速ですが、まず座標を変換する必要があります。

import numpy as np 
x, y = zip(*polygonBoundary) 

def shoelace_formula_3(x, y, absoluteValue = True): 

    result = 0.5 * np.array(np.dot(x, np.roll(y, 1)) - np.dot(y, np.roll(x, 1))) 
    if absoluteValue: 
     return abs(result) 
    else: 
     return result 
+1

'numpy'を使うと便利です。 http://stackoverflow.com/a/30408825/5666087 – Jakub

+0

@Jakub。私は気持ちが悪く、同じパフォーマンスを試してみる。 – Guilhain

+0

多くの座標で試してみてください。あなたが500対の座標を使って両方の関数を試したとき、 'shoelace_formula_3'は' shoelace_formula'(321マイクロ秒)の2倍の速さ(115マイクロ秒)でした。 – Jakub

答えて

0

ここでは1/2のように多くの乗算を使用するバージョンがあります:https://stackoverflow.com/a/717367/763269

あなたも、より高いパフォーマンスが必要な場合は、PythonのC拡張でこれを行うことを検討できます。 CはPythonよりも劇的に高速です。特に数値演算の場合は100-1000xになることがあります。

+0

ありがとうございます。それは優れていますが、数値が低いのは最速です! – Guilhain

関連する問題