作为我的博士论文的一个副项目,我参与了使用Python对某些系统进行建模的任务。就效率而言,我的程序在以下问题上遇到了瓶颈,我将在最小工作示例中公开这个问题。我处理大量由它们的三维起点和终点编码的片段,因此每个片段由6个标量表示。我需要计算成对的最小片段距离。两个片段之间最小距离的解析表达式可以在source中找到。关于MWE:
现在,我意识到这非常低效,这就是我在这里的原因。我广泛地研究了如何避免循环,但我遇到了一个问题。显然,这种计算最好使用python中的cdist。然而,它可以处理的自定义距离函数必须是二元函数。在我的情况下,这是一个问题,因为我的向量具有特定的长度为6,并且必须被拆分为它们的前三个和后三个组件。我不认为我可以将距离计算转换为二进制函数。
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,并且必须被拆分为它们的前三个和后三个组件。我不认为我可以将距离计算转换为二进制函数。
欢迎任何意见。