我目前有一个维度为 (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
有一个选项可以返回 unique 数组中原始数字的索引,你只需要 reshape 它。
u, indices = np.unique(a, return_inverse=True)
b = indices.reshape(a.shape)
这在您的示例中运行大约 20 秒。
关于python - 如何有效地将由节点标识符组成的边列表转换为包含行和列索引的边列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69135641/