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

如何去除二维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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:50:39