有没有一种更快的方法来计算两点矩阵的平方距离之和



我正在努力使以下代码运行得更快。该代码试图通过计算两个帧的平方距离之和来找到两个对象的最近帧,每个帧有137个点(x,y(。在填充距离矩阵之后,我在矩阵中寻找最小距离,并返回该条目的indee。

enter code here
def getSquraredDistancesSum(frame1, frame2):
sum = 0
distance = 0
for i in range(0, 137):
x1 = frame1[i][0]
y1 = frame1[i][1]
x2 = frame2[i][0]
y2 = frame2[i][1]
sum += math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
return sum
def get_closest_frames(dataobj1, dataobj2, endpoint, startpoint):
nf1 = len(dataobj1.body.data)
nf2 = len(dataobj2.body.data)
window1size= int(0.15*nf1) 
window2size = int(0.15*nf2)  
distancematrix = np.zeros(shape=(window1size, window2size))
for i in range(endpoint - window1size, endpoint):
for j in range(startpoint, startpoint + window2size):
d = getSquraredDistancesSum(dataobj1.body.data[i][0], 
dataobj2.body.data[j][0])
distancematrix[i - (endpoint - window1size)][j - startpoint] = d
min = 1000000
newstartpoint = startpoint
newendpoint = endpoint
for i in range(0, window1size):
for j in range(0, window2size):
if distancematrix[i][j] <= min:
min = distancematrix[i][j]
newstartpoint = j + startpoint
newendpoint = i + (endpoint - window1size)
return newstartpoint, newendpoint

我无法准确理解这个问题想要实现的目标。要了解两组点的所有组合之间的差异,这可能会有所帮助。通过将x和y坐标转换为复数,numpy可以将您的帧处理为2个1D阵列。减法生成所有f1-f2差值。

如果这没有帮助,请尝试显示测试数据集和预期测试结果。

import numpy as np 
# Create some test data
np.random.seed( 1234 )
frame1 = np.array( [ np.random.rand( ) * 100 + 50,
np.random.rand( ) * 100 + 50 ] )
frame2 = np.array( [ np.random.rand( ) * 100 + 50,
np.random.rand( ) * 100 + 50 ] )
frame1                                                                                            
# array([[ 69.15194504, 112.2108771 ,  93.7727739 ],
#        [128.53585837, 127.99758081,  77.25926053]])
frame2                                                                                            
# array([[ 77.64642551, 130.18721775, 145.81393537],
#        [137.59326347,  85.781727  , 100.09951255]])

f1 = frame1[ 0 ] + frame1[ 1 ] * 1j  # Make each x & y coord a complex number
f2 = frame2[ 0 ] + frame2[ 1 ] * 1j  # Make each x & y coord a complex number 
f1                                                                                                
# array([ 69.15194504+128.53585837j, 112.2108771 +127.99758081j,
# 93.7727739  +77.25926053j])
f2                                                                                                
# array([ 77.64642551+137.59326347j, 130.18721775 +85.781727j  ,
# 145.81393537+100.09951255j])
differences = f1 - f2[:, None]  # complex differences, 2 dimensions 3 x 3
differences 
# array([[ -8.49448048 -9.0574051j ,  34.56445159 -9.59568266j,
#          16.12634839-60.33400295j],
#        [-61.03527272+42.75413138j, -17.97634065+42.21585382j,
#         -36.41444385 -8.52246647j],
#        [-76.66199033+28.43634582j, -33.60305826+27.89806826j,
#         -52.04116147-22.84025202j]])
distances = np.abs( differences )
print( distances, 'n' )                                                                                    
# [[12.41743878 35.87169413 62.45198975]
#  [74.519932   45.88384396 37.39845125]
#  [81.76604751 43.67456625 56.83273352]] 
print( distances.sum( axis = 0 ), 'n', distances.sum( axis = 1 ) )
#  [168.70341828 125.43010434 156.68317452] # Sum down columns 
#  [110.74112265 157.80222721 182.27334728] # Sum across rows

最新更新