如何有效地将由节点标识符组成的边列表转换为包含行和列索引的边列表?

How can you efficiently convert an edge list comprised of node identifiers into an edge list containing row and column indices?

我目前有一个维度为 (n_edges, 2) 的边数组,其中包含描述为 [NodeID1, NodeID2] 的节点对,它们都是整数。我需要有效地枚举这些 NodeID,以便我可以将它们表示为邻接矩阵中的索引。我目前的方法是提取一组唯一的已排序 NodeID,将它们映射到 0,范围为不同节点的数量,然后使用 pandas.DataFrame.replace(mapping) 替换条目。这是我正在做的一个例子:

import numpy as np
import pandas as pd

a = np.random.randint(0, 100000000, (40000000, 2))
df = pd.DataFrame(a)
unique_values = np.unique(a)
mapping = dict(zip(unique_values, np.arange(len(unique_values))))

df.replace(mapping)

我也试过定义一个函数来应用这个映射并用 NumPy 对其进行矢量化,但它仍然很慢。关于如何更有效地实施它有什么想法吗?

原来 np.unique 有一个选项可以 return 唯一数组中原始数字的索引,你只需要重塑它。

u, indices = np.unique(a, return_inverse=True)
b = indices.reshape(a.shape)

在您的示例中,这将在大约 20 秒内运行。