You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

解决方案

你的代码存在两个核心问题:

  1. numpy数组的in操作无法直接判断一个一维数组是否存在于二维数组中;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:41:04