如何在Numpy中删除二维数组中的“重复”边?

46qrfjad  于 2023-01-30  发布在  其他
关注(0)|答案(1)|浏览(117)

我在Numpy中使用了一个(15000,2)数组,我打算用它来构建一个邻接矩阵,每行表示从节点到i再到j的顶点连接,换句话说,每行的第一个元素与第二个元素有一条边,例如,[24,79]表示节点24和79之间的一条边。
如果存在[79,24]行,我希望将其完全删除,因为[24,79]已经存在。
有没有办法去除这些“重复”的连接,使整个数组只包含单向顶点?我在对称化矩阵之前做了这一步,在对称化矩阵时,我把矩阵加到它的转置上。

zvms9eto

zvms9eto1#

您可以通过对每行中的项目进行排序来轻松跟踪重复边(即重复行)。后者可以使用np.unique来完成。以下是一个示例:

v = np.random.randint(0, 1_000, size=(15000, 2))  # len: 15000
result = np.unique(np.sort(v, axis=1), axis=0)    # len: 14790

result包含唯一无向边的集合,其中对于每一行,最小ID是第一项。计算在O(n log n)时间内高效地完成。
请注意,np.unique的参数return_indexreturn_inverse可用于跟踪未排序的行源索引。还请注意,使用(2, 15_000)数组可能更快,因为该操作更适合SIMD和缓存。

相关问题