使用numpy加速顶点距离计算的方法

时间:2014-02-13 15:32:32

标签: python numpy

我一直在努力研究一种与三维三角矢量相比较的算法。不幸的是,它的位置非常慢,我在不同的方法上来回走动,试图改进它。我正在努力的一件事是加快距离计算。

我有两组三角形,它们被分解为三个点,每个点都有一个3d浮动矢量(xyz)。我正在使用的计算是:

    diffverts = numpy.zeros( (  ntris*3, ntesttris*3, 3 ), dtype = 'float32')
    diffverts += triverts.reshape(ntris*3, 1, 3 )
    diffverts -= ttriverts.reshape(1, ntesttris*3, 3 )
    vertdist = ( diffverts[:,:,0]**2 + diffverts[:,:,1]**2 + diffverts[:,:,2]**2 ) ** 0.5

此计算速度快于:

    diffverts = triverts.reshape(ntris*3, 1, 3 ) - ttriverts.reshape(1, ntesttris*3, 3 )
    vertdist = ( diffverts[:,:,0]**2 + diffverts[:,:,1]**2 + diffverts[:,:,2]**2 ) ** 0.5

是否有更快的方法来填充差异部分(需要更长时间)和/或距离部分,这也非常耗时?由于要测试的组的数量,此代码被多次调用。此外,尝试仅对顶点的索引执行此操作会导致我在尝试返回某些布尔测试时进一步计算的其他问题(即,这只是一组计算中的一个,因此保持三点水平最佳。< / p>

我正在使用numpy和python

2 个答案:

答案 0 :(得分:2)

问题在于所有三角形相对于彼此的强力测试需要二次时间。最好使用专门用于执行此类计算的数据结构。幸运的是,scipy包含一个。

看看scipy.spatial.cKDTree。帮助应该是不言自明的。

答案 1 :(得分:0)

我认为diffverts占用了足够的内存来导致缓存未命中。不幸的是,虽然这个解决方案非常优雅,但您可能最好一次性计算整个距离,以避免必须保存n * m * 3中间值数组。虽然很难看,但我会做嵌套for循环。