0

私はPythonで指定されたポイントからの3D距離を見つけることに取り組んでいます。現在、forループを使用しています。ただし、計算には少し時間がかかります。

Pythonコードは次のとおりです。

    for i_y in xrange(0,500,100):
        y = round(i_y/100.00,2)

        for i_x in xrange(0, 800, 1):
            x = round(i_x/100.00,2)

            for i_z in xrange(500, 0, -1):
                z = round(i_z/100.00,2)

                    for key in specifiedPoints.keys():
                    a = specifiedPoints[key]

                        subx1 = x-a.p1.x
                        suby1 = y-a.p1.y
                        subz1 = z-a.p1.z
                        subx2 = x-a.p2.x
                        suby2 = y-a.p2.y
                        subz2 = z-a.p2.z
                        subx3 = x-a.p3.x
                        suby3 = y-a.p3.y
                        subz3 = z-a.p3.z

                        distver1 = math.sqrt(subx1*subx1+suby1*suby1+subz1*subz1)
                        distver2 = math.sqrt(subx2*subx2+suby2*suby2+subz2*subz2)        
                        distver3 = math.sqrt(subx3*subx3+suby3*suby3+subz3*subz3)

                        if distver1 <= 1 or distver2<=1 or distver3<=1:
                            print "close point:", x, y, z

私はたくさん働きましたが、numpyで等しいループを示す明確なチュートリアルを見つけることができませんでした。

ループを加速するためにこれをnumpyで作成するにはどうすればよいですか?

ありがとうございました

4

2 に答える 2

1

arange 関数は、x、y、z に対して計算した値を直接返すことができ、多くの計算を節約できます。round 関数はまったく必要ありません。ループを 5*800*500 = 2.000.000 回実行し、毎回 100 で割って丸めます。次のようにするとよいでしょう:

    for y in np.arange(0,5,1):
        for x in np.arange(0,8,0.01):
            for z in np.arange(5,0,-0.01):

次のコードのように、ポイントを 1 つの配列に集めます。

    point = np.array([x,y,z])
    a1 = np.array([a.p1.x,a.p1.y,a.p1.z])
    a2 = np.array([a.p2.x,a.p2.y,a.p2.z])
    a3 = np.array([a.p3.x,a.p3.y,a.p3.z])

    if np.linalg.norm(point-a1) <=1:
        print point
        continue
    if np.linalg.norm(point-a2) <=1:
        print point
        continue
    if np.linalg.norm(point-a3) <=1:
        print point
        continue

オブジェクト specifiedPoints[key] に numpy 配列としてポイントを直接保存し、ループごとに何度もポイントを収集しない方がよいでしょう。これにより、次のコードが得られます。

    point = np.array([x,y,z])

    if np.linalg.norm(point-a.p1) <=1:
        print point
        continue
    if np.linalg.norm(point-a.p2) <=1:
        print point
        continue
    if np.linalg.norm(point-a.p3) <=1:
        print point
        continue
于 2012-05-15T14:14:53.987 に答える
1

私はscipy.spatial.distance、特にメソッドcdistpdistメソッドを見ていきます:

http://docs.scipy.org/doc/scipy/reference/spatial.distance.html

于 2012-05-15T22:03:41.530 に答える