如何在Numpy二维数组中移除重复无向边?
移除无向图边数组中的反向重复项
方法一:排序后去重(高效推荐)
利用Numpy的向量化操作快速处理,先将每条边的两个节点按从小到大排序,让反向边变成完全相同的行,再去重:
import numpy as np # 假设你的边数组是edges edges = np.array([[24, 79], [79, 24], [10, 20], [20, 10], [5, 15]]) # 对每条边的节点排序,统一格式 sorted_edges = np.sort(edges, axis=1) # 按行去重,保留唯一边 unique_edges = np.unique(sorted_edges, axis=0) print(unique_edges) # 输出:[[ 5 15] # [10 20] # [24 79]]
这种方法性能优异,处理15000行数据毫无压力,Numpy底层的C实现比Python循环快得多。
方法二:保留首次出现的原始边
如果你希望保留数组中先出现的那条边(而不是排序后的格式),可以用Python循环结合集合记录已出现的节点对:
import numpy as np edges = np.array([[24, 79], [79, 24], [10, 20], [20, 10], [5, 15]]) seen = set() unique_edges = [] for u, v in edges: # 检查当前边和反向边是否都未被记录 if (u, v) not in seen and (v, u) not in seen: seen.add((u, v)) unique_edges.append([u, v]) unique_edges = np.array(unique_edges) print(unique_edges) # 输出:[[24 79] # [10 20] # [ 5 15]]
这种方法会保留原始数组中第一次出现的边的方向,但对于超大规模数组,效率不如第一种方法。
内容的提问来源于stack exchange,提问作者itsanhtuanho
相关产品推荐
相关产品推荐

