首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找网络中每个节点的一阶和二阶联系人

问查找网络中每个节点的一阶和二阶联系人
EN

Stack Overflow用户
提问于 2019-09-07 07:47:29
回答 2查看 294关注 0票数 0

我有一个有602647个节点和982982个边的图。我想为Networkx图中的每个节点找到一阶和二阶联系人(即1跳联系人和2跳联系人)。

我构建了以下代码,它对于较小的图很好地工作,但从未完成对更大的图(如上面所示的图)的运行:

代码语言:javascript
复制
hop_1 = {}
hop_2 = {}
row_1 = {}
row_2 = {}

for u, g in G.nodes(data=True):
    row_1.setdefault(u, nx.single_source_shortest_path_length(G, u, cutoff=1))
    row_2.setdefault(u, nx.single_source_shortest_path_length(G, u, cutoff=2))
    hop_1.update(row_1)
    hop_2.update(row_2)

一些注意事项:

  • 结果首先存储在dict中(hope_1和hope_2)
  • row_1和row_2与临时持有变量
  • hop-1将在一次跳转后包含节点。
  • hop-2将包括位于一个跳转和两个跳转的节点。

是否有优化/改进此代码并完成运行的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-07 10:59:15

我不知道networkx;但是,根据定义,一个可以到达的节点在<=2跳中也是可到达的,这就是single_source_shortest_path_length提供给您的。因此,您可以删除对single_source_shortest_path_length的第一个调用。

第二,你对字典的使用是非常奇怪的!为什么要使用setdefault而不是仅仅设置元素?而且,您正在使用update进行大量的复制,它不会做任何有用的事情,只会浪费时间。

我会做这样的事:

代码语言:javascript
复制
hop_1 = {}
hop_2 = {}

for u in G.nodes():
    d1 = []
    d2 = []
    for v, n in nx.single_source_shortest_path_length(G, u, cutoff=2).items():
        if n == 1:
            d1.append(v)
        elif n == 2:
            d2.append(v)
    hop_1[u] = d1
    hop_2[u] = d2

它在我的笔记本上花了大约一分钟的时间,上面有一个G_nm图形,由:

代码语言:javascript
复制
import networkx as nx

G = nx.gnm_random_graph(602647, 982982)

请注意,tqdm很好地显示了长时间运行循环的进度,只需要import tqdm,并将外部for循环更改为:

代码语言:javascript
复制
for u in tqdm(G.nodes()):
   ...

你会得到一个很好的酒吧报告进度

票数 1
EN

Stack Overflow用户

发布于 2019-09-07 15:50:45

要查找一阶和二阶邻居,可以使用函数all_neighbors()和node_boundary()。

​

​

代码语言:javascript
复制
hop1 = {}
hop2 = {}

for n in G.nodes():
    neighbs1 = list(nx.all_neighbors(G, n))
    hop1[n] = neighbs1
    hop2[n] = list(nx.node_boundary(G, neighbs1 + [n])) + neighbs1

print(hop1)
# {0: [1, 2, 3], 1: [0, 2, 3], 2: [0, 1, 3, 4], 3: [0, 1, 2, 4], 4: [2, 3]}
print(hop2)
# {0: [4, 1, 2, 3], 1: [4, 0, 2, 3], 2: [0, 1, 3, 4], 3: [0, 1, 2, 4], 4: [0, 1, 2, 3]}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57831743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档