【发布时间】:2015-02-24 10:36:42
【问题描述】:
对于我博士期间的一个副项目,我从事了用 Python 对某些系统进行建模的任务。在效率方面,我的程序在以下问题中遇到了瓶颈,我将在一个最小的工作示例中展示。
我处理大量由它们的 3D 起点和终点编码的片段,因此每个片段由 6 个标量表示。
我需要计算成对的最小段间距离。两个线段之间最小距离的解析表达式见此source。致 MWE:
import numpy as np
N_segments = 1000
List_of_segments = np.random.rand(N_segments, 6)
Pairwise_minimal_distance_matrix = np.zeros( (N_segments,N_segments) )
for i in range(N_segments):
for j in range(i+1,N_segments):
p0 = List_of_segments[i,0:3] #beginning point of segment i
p1 = List_of_segments[i,3:6] #end point of segment i
q0 = List_of_segments[j,0:3] #beginning point of segment j
q1 = List_of_segments[j,3:6] #end point of segment j
#for readability, some definitions
a = np.dot( p1-p0, p1-p0)
b = np.dot( p1-p0, q1-q0)
c = np.dot( q1-q0, q1-q0)
d = np.dot( p1-p0, p0-q0)
e = np.dot( q1-q0, p0-q0)
s = (b*e-c*d)/(a*c-b*b)
t = (a*e-b*d)/(a*c-b*b)
#the minimal distance between segment i and j
Pairwise_minimal_distance_matrix[i,j] = sqrt(sum( (p0+(p1-p0)*s-(q0+(q1-q0)*t))**2)) #minimal distance
现在,我意识到这非常低效,这就是我在这里的原因。我已经广泛研究了如何避免循环,但我遇到了一些问题。显然,这种计算最好用 python 的cdist 来完成。但是,它可以处理的自定义距离函数必须是二进制函数。在我的情况下这是一个问题,因为我的向量的长度特别是 6,并且必须按位拆分为它们的第一个和最后 3 个分量。我不认为我可以将距离计算转换为二进制函数。
感谢任何输入。
【问题讨论】:
-
可以在这里提供
octree(common uses 提到维基百科上的最近邻搜索)的帮助吗? -
你读过 Lumelsky 的On fast computation of distance between line segments [PDF 警告] 吗?你的实现与它相比如何? (可以找到更通用的方法here)
-
谢谢你的链接,我去看看。
-
@Michael Foukarakis,我很快阅读了这篇论文,这是我自己分析得出的。它没有具体说明如何加速计算。它只是概述了一种处理特殊情况的聪明方法。虽然很好读
标签: python performance binary distance