Delaney三角剖分的欧氏距离-Scipy

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?