如何在Python中从tri.simplices列表删除指定Delaunay三角形
移除Delaunay三角剖分中的重复三角形
我通过两个不同的numpy顶点数组构建了两个Delaunay三角剖分,两者存在两个相同的三角形,希望从其中一个三角剖分的tri.simplices列表中删除这些重复三角形。
代码示例
import numpy as np from scipy.spatial import Delaunay cloud1 = np.array([[4.2, 4.5], [4.4, 5.3], [6.2, 5.6], [4.75, 5], [5.2, 4.8]]) cloud2 = np.array([[4.2, 4.5], [4.4, 5.3], [6.2, 5.6], [4.75, 5]]) tri1 = Delaunay(cloud1) tri2 = Delaunay(cloud2) print(tri1.simplices) print("*************") print(tri2.simplices)
运行结果
[[1 3 2] [3 4 2] [3 1 0] [4 3 0]] ************* [[2 3 0] [3 1 0] [1 3 2]]
尝试的错误代码
for i in range(0,len(tri1.simplices)): if (tri1.simplices[i] in tri2.simplices): np.delete(tri1.simplices, tri1.simplices[i]) else: continue
解决方案
你的代码存在两个核心问题:
- numpy数组的
in操作无法直接判断一个一维数组是否存在于二维数组中; np.delete()不会原地修改数组,需要重新赋值,且循环中修改数组长度会导致索引错位。
正确的思路是先统一三角形顶点的顺序(因为同一个三角形的顶点排列顺序不固定,比如[1,3,2]和[2,3,1]属于同一个三角形),再通过集合快速查找重复项:
import numpy as np from scipy.spatial import Delaunay cloud1 = np.array([[4.2, 4.5], [4.4, 5.3], [6.2, 5.6], [4.75, 5], [5.2, 4.8]]) cloud2 = np.array([[4.2, 4.5], [4.4, 5.3], [6.2, 5.6], [4.75, 5]]) tri1 = Delaunay(cloud1) tri2 = Delaunay(cloud2) # 对每个三角形的顶点排序,统一表示方式 tri1_sorted = np.sort(tri1.simplices, axis=1) tri2_sorted = np.sort(tri2.simplices, axis=1) # 把tri2的三角形转成元组集合,方便快速查找 tri2_set = set(tuple(tri) for tri in tri2_sorted) # 过滤tri1中不在tri2里的三角形 filtered_simplices = tri1.simplices[~np.array([tuple(tri) in tri2_set for tri in tri1_sorted])] print("过滤后的tri1.simplices:") print(filtered_simplices)
运行结果
过滤后的tri1.simplices: [[3 4 2] [4 3 0]]
内容的提问来源于stack exchange,提问作者Volkan Atar
相关产品推荐
相关产品推荐

