如何让下一段代码运行得更快? 我首先计算了多个点之间的距离(没问题),但在那之后,我需要得到一个列表中所有点的值的平均值(在这种情况下为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)
答案 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)
如果计算一组点之间的所有距离,则可能是复杂性问题。随着点集的增加,可能组合的数量急剧增加。