编辑:这个问题并不是专门用于计算距离,而是循环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))
显然,我是一个笨拙的新手。我不会惊讶地发现这是重复的,但我没有找到答案的笨拙词汇。任何帮助表示赞赏!
答案 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)