我正在计算多个点之间的距离。数组gals_pos
非常大(近100,000点),sph_pos
有20分。
问题在于它是一个慢代码。我想快速完成它,因为我将它应用到超过十亿个点(数组gals_pos
)。
我调用代码的以下部分来给我一些距离。首先,我调用名为distance_calc
的函数并获取x轴上的距离,然后在y轴和z轴上。然后我使用dx
,dy
和dz
来计算距离的大小。请建议我可以加快速度的方法。
import numpy as np
import time
gals_pos = np.random.uniform(low = 0.0, high = 1000.0, size = (10000,3))
sph_pos = np.random.uniform(low = 0.0, high = 1000.0, size = (100,3))
max_axis_lim = 1000.0
min_axis_lim = 0.0
shift_position_constant = max_axis_lim/2
time_init = time.clock()
def distance_calc(gals_pos,sph_pos, axis):
dxyzd = gals_pos[None, :, axis] - sph_pos[:, None, axis]
#dxyzd_cdist = spatial.cdist(sph_pos, gals_pos, 'euclidean') #unusable here since we want to do axis subtraction for dx, dy and dz
dxyzd[dxyzd>max_axis_lim] -= shift_position_constant
dxyzd[dxyzd<min_axis_lim] += shift_position_constant
return dxyzd
def dist_mag(dx,dy,dz):
dist_m = np.sqrt(dx**2+dy**2+dz**2)
return dist_m
dxx = distance_calc(gals_pos,sph_pos,0)
dyy = distance_calc(gals_pos,sph_pos,1)
dzz = distance_calc(gals_pos,sph_pos,2)
dist_d = dist_mag(dxx,dyy,dzz)
time_final = time.clock()
time = time_final-time_init
print "time taken = ", time
time taken = 0.11
答案 0 :(得分:1)
正如评论中所指出的那样,你无法做很多事情来加快速度;虽然你可以使用几个线程使用numexpr获得高达十倍的因子。
然而,更大的问题是:你真的需要所有的成对距离吗?除非你正在编写自己的重力模拟器,并且很高兴以蛮力的方式去做,答案可能是否定的。要计算短距离交互,例如碰撞检测,请查看scipy.spatial中的功能。对于典型问题,它将快许多个数量级。
答案 1 :(得分:0)