德莱尼三角剖分的欧氏距离 - Scipy
Euclidean distance of Delaney triangulation - Scipy
从Scipy
导入的spatial
包可以测量指定点之间的欧氏距离。是否可以使用 Delaunay
包进行 return 相同的测量?使用下面的 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,1,1,2,2,2,2],
'A_X' : [5, 5, 6, 6, 4, 3, 3, 4],
'A_Y' : [5, 6, 6, 5, 5, 6, 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])
此函数将首先找到给定三角形的所有唯一边,然后 return 三角形边的平均长度。应用此功能
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],[1,4]]))
所以,你必须确保这些点不在同一条线上。
从Scipy
导入的spatial
包可以测量指定点之间的欧氏距离。是否可以使用 Delaunay
包进行 return 相同的测量?使用下面的 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,1,1,2,2,2,2],
'A_X' : [5, 5, 6, 6, 4, 3, 3, 4],
'A_Y' : [5, 6, 6, 5, 5, 6, 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])
此函数将首先找到给定三角形的所有唯一边,然后 return 三角形边的平均长度。应用此功能
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],[1,4]]))
所以,你必须确保这些点不在同一条线上。