如何去除二维NumPy数组中重复的有限元网格边节点对
去除有限元网格边的双向重复项
问题背景
我有一个包含多个NumPy数组的二维NumPy数组,其中每个子数组存储一条线段两个角节点的笛卡尔坐标,示例输入如下:
import numpy as np edges = np.array([ [[0,10,10], [10,20,20]], [[0,10,20], [10,10,20]], [[10,10,10], [10,20,20]], [[10,20,20], [0,10,10]] ])
这些节点是有限元网格的角节点,节点对代表网格中的所有边。目前存在双向重复的边(如(node1, node2)和(node2, node1)),需要保留每条边仅一次,处理后的期望结果如下:
array([[[ 0, 10, 10], [10, 20, 20]], [[ 0, 10, 20], [10, 10, 20]], [[10, 10, 10], [10, 20, 20]]])
解决方案
核心思路是将每条边的两个节点按固定规则排序,让双向重复的边转化为完全相同的数组形式,再利用NumPy的去重功能处理。
具体实现代码
import numpy as np # 1. 定义输入边数组 edges = np.array([ [[0,10,10], [10,20,20]], [[0,10,20], [10,10,20]], [[10,10,10], [10,20,20]], [[10,20,20], [0,10,10]] ]) # 2. 对每条边的两个节点按坐标升序排序(沿边内节点维度排序) sorted_edges = np.sort(edges, axis=1) # 3. 展平后去重,再恢复原数组形状 # 展平为(N, 6)的二维数组(每个边的2个3D坐标合并为1行) flattened = sorted_edges.reshape(edges.shape[0], -1) # 按行去重 unique_flattened = np.unique(flattened, axis=0) # 恢复为(N, 2, 3)的原边结构 unique_edges = unique_flattened.reshape(-1, 2, 3) # 输出结果 print(unique_edges)
代码解释
- 排序处理:
np.sort(edges, axis=1)针对每条边的两个节点(axis=1指定边内的节点维度)进行升序排序,确保(nodeA, nodeB)和(nodeB, nodeA)被转化为完全一致的节点顺序。 - 展平与去重:将每个边的坐标展平为一维数组后,
np.unique(..., axis=0)可以精准识别重复的边并去重。 - 形状恢复:最后将去重后的展平数组恢复为原有的
(边数, 2个节点, 3个坐标)结构。
注意事项
如果边的节点坐标是浮点数,可能存在精度误差导致排序或去重失效,此时可以先对坐标进行四舍五入(如np.round(edges, decimals=6)),或使用基于np.allclose的循环去重逻辑(适合数据量较小的场景)。
内容的提问来源于stack exchange,提问作者Abdel O.
相关产品推荐
相关产品推荐

