使用numpy和scipy进行更快速的数学计算

时间:2014-12-26 12:46:24

标签: python function numpy scipy

我正在计算多个点之间的距离。数组gals_pos非常大(近100,000点),sph_pos有20分。

问题在于它是一个慢代码。我想快速完成它,因为我将它应用到超过十亿个点(数组gals_pos)。

我调用代码的以下部分来给我一些距离。首先,我调用名为distance_calc的函数并获取x轴上的距离,然后在y轴和z轴上。然后我使用dxdydz来计算距离的大小。请建议我可以加快速度的方法。

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

2 个答案:

答案 0 :(得分:1)

正如评论中所指出的那样,你无法做很多事情来加快速度;虽然你可以使用几个线程使用numexpr获得高达十倍的因子。

然而,更大的问题是:你真的需要所有的成对距离吗?除非你正在编写自己的重力模拟器,并且很高兴以蛮力的方式去做,答案可能是否定的。要计算短距离交互,例如碰撞检测,请查看scipy.spatial中的功能。对于典型问题,它将快许多个数量级。

答案 1 :(得分:0)