代码工作但速度太慢

时间:2013-10-10 08:54:18

标签: python numpy

如何让下一段代码运行得更快? 我首先计算了多个点之间的距离(没问题),但在那之后,我需要得到一个列表中所有点的值的平均值(在这种情况下为20m),如果那个20是很小,这段代码很快,但除此之外,它很慢,因为我需要索引等 - 下一段代码正是我想要的,但是如果我拿20代价而不是例如6代表它是非常慢的(因为对于20,大约有100点足够接近,而对于6代表,只有3或5或者))

D = numpy.sqrt((xf[:,None] - xg[None,:])**2 + (yf[:,None] - yg[None,:])**2 + (zf[:,None] - zg[None,:])**2)
dumdic = {}
l1=[]
for i in range(len(xf)):
    dumdic[i] = D[i,:][D[i,:]<20]  # gets the values where the distance is small enough
    A=[]
    for j in range(len(dumdic[i])):
        A.append(G.epsilon[list(D[i,:]).index(dumdic[i][j])])  # for each point in that dummy dictionary, gets the index where i need to take the epsilon value, and than adds that right epsilon value to A
    l1.append(numpy.mean(numpy.array(A)))
a1 = numpy.array(l1)

G.epsilon是一个数组,其中每个点我们都有一个测量值。所以在那个数组中,我需要(对于另一个数组中的每个点)取这个数组中所有点的平均值,这些点足够接近另一个点。

如果您需要更多详细信息,请询问

在@gregwittier回复之后,这是更好的版本: 有谁可以oneliner吗? (twoliner,因为D = ......需要一行) 如果我没有l1 = ...并且重铸到numpy数组,那我会更加pythonic,但现在最糟糕的事情就是通过使用一个轴参数来杀死那个for循环?

D = numpy.sqrt((xf[:,None] - xg[None,:])**2 + (yf[:,None] - yg[None,:])**2 + (zf[:,None] - zg[None,:])**2)
l1=[]
for i in range(len(xf)):
    l1.append(numpy.mean(G.epsilon[D[i,:]<20]))
a1 = numpy.array(l1)

3 个答案:

答案 0 :(得分:2)

我认为这就是你想要的。

D2 = (xf[:,None] - xg[None,:])**2 + (yf[:,None] - yg[None,:])**2 + (zf[:,None] - zg[None,:])**2
near = D2 < 20**2
a1 = np.array([G.epsilon[near_row].mean() for near_row in near])

你可以通过组合第2行和第3行来挤压另一条线。

D2 = (xf[:,None] - xg[None,:])**2 + (yf[:,None] - yg[None,:])**2 + (zf[:,None] - zg[None,:])**2
a1 = np.array([G.epsilon[near_row].mean() for near_row in D2 < 20**2])

答案 1 :(得分:1)

您的文字描述似乎与您的示例代码实际上的描述不同。从单词描述中,我认为你需要像

这样的东西
dist_sq = (xf-xg)**2 + (yf-yg)**2
near = (dist_sq < 20*20)
return dist_sq[near].mean()

我无法理解你的示例代码,所以我不知道如何匹配它的功能。也许您仍然需要迭代其中一个维度(即您可能仍需要示例中的外部for循环)。

答案 2 :(得分:0)

如果计算一组点之间的所有距离,则可能是复杂性问题。随着点集的增加,可能组合的数量急剧增加。

enter image description here