删除嵌套for循环以查找重合值

时间:2017-08-30 21:20:19

标签: python performance python-3.x numpy for-loop

我目前正在使用嵌套的for循环迭代到数组以查找符合特定条件的值。问题是这种方法非常低效且耗时。我被告知更好的方法可能是根据数据对两个数组进行排序,但这要求我将几个1D数组和一个多D数组合并,基于一列进行排序,然后再将它们分开。有更有效的方法吗?以下是我的代码示例:

x1 = []
x2 = []
velocity = []
plane1Times = np.array([[2293902],[2848853],[482957]])
plane2Times = np.array([[7416504],[2613113],[2326542]])
plane1Local = np.array([[0,0,0],[0,u,0],[0,2*u,0],[u,0,0],[u,u,0],[u,2*u,0],[2*u,0,0],[2*u,u,0],[2*u,2*u,0],[3*u,0,0],[3*u,u,0],[3*u,2*u,0]],dtype='float')
plane2Local = np.array([[0,0,D],[0,u,D],[0,2*u,D],[u,0,D],[u,u,D],[u,2*u,D],[2*u,0,D],[2*u,u,D],[2*u,2*u,D],[3*u,0,D],[3*u,u,D],[3*u,2*u,D]],dtype='float')
for i in range(0,len(plane1Times)):
    tic = time.time()
    for n in range(0,len(plane2Times)):
        if plane2Times[n] - plane1Times[i] <= 10000 and plane2Times[n] - plane1Times[i] > 0:
            x1 = plane1Local[plane1Dets[i]]
            x2 = plane2Local[plane2DetScale[n]]
            distance = np.sqrt((x2[0]-x1[0])**2 + (x2[1]-x1[1])**2 + (x2[2])**2)
            timeSeparation = (plane2Times[n]-plane1Times[i])*timeScale
            velocity += distance/timeSeparation
            break

为了举例说明它目前正在进行的时间,每个数组的时间长度为10 ** 6,因此i中的100个循环大约需要60秒。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

我无法测试,因为您提供的代码不完整,但这是一个可能的解决方案

for index,value in enumerate(plane1Times):
    vec = plane2Times - value
    row,col = np.where((vec<=10000)&(vec>0))
    if len(row) > 0:
        x1 = plane1Local[plane1Dets[index]]
        x2 = plane2Local[plane2DetScale[row[0]]]
        distance = np.sqrt((x2[0] - x1[0]) ** 2 + (x2[1] - x1[1]) ** 2 + (x2[2]) ** 2)
        timeSeparation = (plane2Times[row[0]] - plane1Times[index]) * timeScale
        velocity += distance / timeSeparation

消除第二个循环,只需一次完成减法。然后搜索新数组,在那里它符合您的标准。由于您似乎想要第一个值,只需使用第一个索引(如row[0])来获取值检查的索引。删除第二个for循环应该会大大减少时间。