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

标签 python adjacency-matrix

我目前有一个维度为 (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/

相关文章:

r - 从邻接矩阵中快速计算任意一对节点之间的共享邻居数

java - Java中的邻接矩阵

algorithm - 如何合并给定邻接矩阵的节点

python - 创建字典,其中键来自列表,值是另一个列表中相应元素的总和

javascript - 如何在 JavaScript 中将邻接矩阵转换为邻接列表?

python - MySQL Django 模型中的 boolean 字段?

python - 无法以编程方式验证用户身份

matlab - 在 MATLAB 中生成随机加权邻接矩阵

Python oauth2 - 获取访问 token

python - mysql django 的 NULL 和 FALSE 是否相同?