计算numpy数组成对欧几里德距离除了self

时间:2015-03-18 20:52:25

标签: python arrays numpy iteration euclidean-distance

编辑:这个问题并不是专门用于计算距离,而是循环numpy数组的最有效方法,指定对于索引i,所有比较都应该与数组的其余部分进行比较,只要第二个索引是不是我。

我有一个带有列(X,Y,ID)的numpy数组,想要将每个元素与每个其他元素进行比较,但不是自己。因此,对于每个X,Y坐标,我想计算彼此之间的距离X,Y坐标,但不是自身(距离= 0)。

这就是我所拥有的 - 必须有更多" numpy"写这个的方式。

import math, arcpy
# Point feature class
fc = "MY_FEATURE_CLASS"
# Load points to numpy array: (X, Y, ID)
npArray = arcpy.da.FeatureClassToNumPyArray(fc,["SHAPE@X","SHAPE@Y","OID@"])
for row in npArray:
    for row2 in npArray:
        if row[2] != row2[2]:
            # Pythagoras's theorem
            distance = math.sqrt(math.pow((row[0]-row2[0]),2)+math.pow((row[1]-row2[1]),2))

显然,我是一个笨拙的新手。我不会惊讶地发现这是重复的,但我没有找到答案的笨拙词汇。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:0)

使用SciPy的pdist,您可以编写类似

的内容
from scipy.spatial.distance import pdist, squareform

distances = squareform(pdist(npArray, lambda a,b: np.sqrt((a[0]-b[0])**2 + (a[1]-b[1])**2)))

pdist将使用忽略第3个坐标(在本例中为您的ID)的自定义指标来计算成对距离。 squareform将其转换为更具可读性的矩阵,使得distances[0,1]给出第0行和第1行之间的距离。

答案 1 :(得分:0)

X的每一行都是3维数据实例或点。 输出pairwisedist[i, j]X[i, :]X[j, :]的距离

X = np.array([[6,1,7],[10,9,4],[13,9,3],[10,8,15],[14,4,1]])
a = np.sum(X*X,1)
b = np.repeat( a[:,np.newaxis],5,axis=1)
pairwisedist = b + b.T -2* X.dot(X.T)