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

2024-04-25 05:07:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用嵌套for循环遍历数组,以查找符合特定条件的值。问题是这种方法效率低下,而且耗时。我被告知更好的方法可能是根据数据对两个数组进行排序,但这需要我将几个一维数组和一个多维数组组合起来,根据一列进行排序,然后再次将它们分开。有没有更有效的方法?以下是我的代码示例:

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秒。有人能帮我吗?你知道吗


Tags: 方法for排序np数组floatarrayx1
1条回答
网友
1楼 · 发布于 2024-04-25 05:07:54

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

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循环会大大减少时间。你知道吗

相关问题 更多 >