如何解决Delaney三角剖分的欧氏距离-Scipy
从spatial
导入的Scipy
包可以测量指定点之间的欧几里得距离。使用delaunay
包是否可以返回相同的测量值?使用下面的df
,以Time
分组的方式测量所有点之间的平均距离。但是,我希望使用delaunay三角剖分法来测量平均距离。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import delaunay
df = pd.DataFrame({
'Time' : [1,1,2,2],'A_X' : [5,5,6,4,3,4],'A_Y' : [5,6],})
def make_points(x):
return np.array(list(zip(x['A_X'],x['A_Y'])))
points = df.groupby("Time").apply(make_points)
for p in points:
tri = delaunay(p)
ax.triplot(*p.T,tri.simplices)
所有点之间的平均距离可以使用下面的方法进行测量,但我希望将delaunay纳入其中。
avg_dist = (df.groupby(['Time'])
.apply(lambda x: spatial.distance.pdist
(np.array(list(zip(x['A_X'],x['A_Y']))))
.mean() if len(x) > 1 else 0)
.reset_index()
)
预期输出:
Time 0
0 1 1.082842
1 2 1.082842
解决方法
您可以尝试使用此功能
from itertools import combinations
import numpy as np
def edges_with_no_replacement(points):
# get the unique coordinates
points = np.unique(points.loc[:,['A_X','A_Y']].values,return_index=False,axis=0)
if len(points) <= 1: return 0
# for two points,no triangle
# I think return the distance between the two points make more sense? You can change the return value to zero.
if len(points) == 2: return np.linalg.norm(points[0]-points[1])
tri = Delaunay(points)
triangles = tri.simplices
# get all the unique edges
all_edges = set([tuple(sorted(edge)) for item in triangles for edge in combinations(item,2)])
# compute the average dist
return np.mean([np.linalg.norm(points[edge[0]]-points[edge[1]]) for edge in all_edges])
此函数将首先查找给定三角形的所有唯一边,然后返回三角形边的平均长度。应用此功能
avg_dist = (df.groupby(['Time']).apply(edges_with_no_replacement).reset_index())
输出为
Time 0
0 1 1.082843
1 2 1.082843
请注意,例如,如果点在同一条线上,则函数edges_with_no_replacement
仍将抛出QhullError
Delaunay(np.array([[1,2],[1,3],4]]))
因此,您必须确保这些点不在同一条线上。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。