我在Numpy中使用了一个(15000,2)数组,我打算用它来构建一个邻接矩阵,每行表示从节点到i再到j的顶点连接,换句话说,每行的第一个元素与第二个元素有一条边,例如,[24,79]表示节点24和79之间的一条边。如果存在[79,24]行,我希望将其完全删除,因为[24,79]已经存在。有没有办法去除这些“重复”的连接,使整个数组只包含单向顶点?我在对称化矩阵之前做了这一步,在对称化矩阵时,我把矩阵加到它的转置上。
zvms9eto1#
您可以通过对每行中的项目进行排序来轻松跟踪重复边(即重复行)。后者可以使用np.unique来完成。以下是一个示例:
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_index和return_inverse可用于跟踪未排序的行源索引。还请注意,使用(2, 15_000)数组可能更快,因为该操作更适合SIMD和缓存。
result
O(n log n)
return_index
return_inverse
(2, 15_000)
1条答案
按热度按时间zvms9eto1#
您可以通过对每行中的项目进行排序来轻松跟踪重复边(即重复行)。后者可以使用
np.unique
来完成。以下是一个示例:result
包含唯一无向边的集合,其中对于每一行,最小ID是第一项。计算在O(n log n)
时间内高效地完成。请注意,
np.unique
的参数return_index
和return_inverse
可用于跟踪未排序的行源索引。还请注意,使用(2, 15_000)
数组可能更快,因为该操作更适合SIMD和缓存。