2

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

3 回答 3

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])
于 2013-10-10T10:00:16.420 回答
1

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

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

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

于 2013-10-10T09:07:08.087 回答
0

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

在此处输入图像描述

于 2013-10-10T09:18:15.457 回答