代码起作用,但太过复杂

2024-05-23 23:31:04 发布

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

如何使下一段代码运行得更快? 我首先计算多个点之间的距离(没问题),但是在那之后,我需要得到一个列表中所有点的值的平均值,这些点都比(在这个例子中是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)

epsilon是一个数组,其中每个点都有一个测量值。所以在这个数组中,我需要取(另一个数组中的每一个点)这个数组中所有点的平均值,这些点足够接近另一个点。你知道吗

如果你需要更多的细节,尽管问

在@gregwittier回复后,这是更好的版本: 有人能写一行吗?(两行,因为D=。。。取一行) 我想如果我没有l1=。。。重铸numpy数组,但现在最糟糕的事情是通过使用axis参数来终止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)

Tags: theinnumpynonel1forlenrange
3条回答

您的文字描述似乎与示例代码实际所做的有所不同。从文字描述来看,我认为你需要

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

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

如果计算一组点之间的all距离,则可能是一个复杂的问题。随着点集的增加,可能的组合数量急剧增加。你知道吗

enter image description here

我想这就是你想要的。你知道吗

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])

你可以把第二行和第三行合起来再挤下一行。你知道吗

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])

相关问题 更多 >