如何高效在PyVista PolyData网格中定位含指定顶点的单元并着色
高效实现PolyData网格中包含指定顶点的单元着色
原代码通过坐标调用find_containing_cell逐个查找单元,在大型网格中效率极低——因为每次查找都需要遍历网格判断空间包含关系,循环叠加后耗时剧增。
优化思路
直接利用PyVista预先维护的点-单元关联数据,跳过空间查找步骤。PolyData对象的point_cells属性存储了每个顶点所属的所有单元ID列表,直接读取这些关联信息即可快速定位目标单元。
优化后代码
import pyvista as pv import numpy as np mesh = pv.Sphere() # 初始化单元标量为0 data = np.zeros(mesh.n_cells, dtype=int) # 指定需要关联的顶点索引 point_indexes = np.random.randint(0, mesh.n_points, 100) # 收集所有包含指定顶点的单元ID(去重) target_cells = np.concatenate([mesh.point_cells[point] for point in point_indexes]) target_cells = np.unique(target_cells) # 标记目标单元 data[target_cells] = 1 mesh.cell_data['data'] = data mesh.plot()
关键说明
mesh.point_cells是PyVista内置的关联数据结构,无需额外计算,读取速度极快;- 使用
np.concatenate和np.unique实现向量化操作,避免循环中的重复赋值,进一步提升效率; - 该方法的时间复杂度与指定顶点数量及关联单元数量正相关,远低于原方法的线性遍历复杂度。
内容的提问来源于stack exchange,提问作者Zep
相关产品推荐
相关产品推荐

