使用networkx查看某一个节点的一阶/二阶/三阶邻居

文章目录

      • 前言
      • 手动
      • 高级

前言

一般情况下,貌似这些图之类的包,只提供查询一个节点的一阶邻居,但是有的时候我们需要二阶甚至三阶,那么该如何做呢?

注意一下,本文的方法仅可以针对二阶或者三阶,更高阶的代码没有提供。

假设有下面这个图。

h = nx.Graph()
h.add_nodes_from(list(range(1, 8)))
h.add_edges_from([(1, 2), (1, 3), (1, 5), (1, 4), (2, 8), (2, 6), (3, 6), (4, 7)])

使用networkx查看某一个节点的一阶/二阶/三阶邻居_第1张图片

手动

import networkx as nx

def find123Nei(G, node):
    nodes = list(nx.nodes(G))
    nei1_li = []
    nei2_li = []
    nei3_li = []
    for FNs in list(nx.neighbors(G, node)):  # find 1_th neighbors
        nei1_li .append(FNs)

    for n1 in nei1_li:
        for SNs in list(nx.neighbors(G, n1)):  # find 2_th neighbors
            nei2_li.append(SNs)
    nei2_li = list(set(nei2_li) - set(nei1_li))
    if node in nei2_li:
        nei2_li.remove(node)

    for n2 in nei2_li:
        for TNs in nx.neighbors(G, n2):
            nei3_li.append(TNs)
    nei3_li = list(set(nei3_li) - set(nei2_li) - set(nei1_li))
    if node in nei3_li:
        nei3_li.remove(node)

    return nei1_li, nei2_li, nei3_li

然后调用上述代码即可查看

neighbors = find123Nei(h, 1)
print(neighbors[0])  # 输出节点的一阶邻居
print(neighbors[1])  # 输出节点的二阶邻居
print(neighbors[2])  # 输出节点的三阶邻居

结果输出如下:

[2, 3, 5, 4]
[8, 6, 7]
[]

上述核心代码来自:https://blog.csdn.net/qq_37730871/article/details/111562527。

高级

对于二阶,其实还有一种方法,但是这种方法据我所知只适合于二阶邻居的查找,效率比前面那种方法更高(一般而言),尤其是大量节点需要查找二阶邻居的时候。

adjm=nx.adjacency_matrix(h).todense()
k=2#2阶邻居,不要设置为3,否则结果并不是3阶邻居。
adjmk=adjm
while k>1:
    adjmk=np.matmul(adjmk,adjm)
    k=k-1
#就这样
adjmk

matrix([[4, 0, 0, 0, 0, 2, 1, 1],
[0, 3, 2, 1, 1, 0, 0, 0],
[0, 2, 2, 1, 1, 0, 0, 0],
[0, 1, 1, 2, 1, 0, 0, 0],
[0, 1, 1, 1, 1, 0, 0, 0],
[2, 0, 0, 0, 0, 2, 0, 1],
[1, 0, 0, 0, 0, 0, 1, 0],
[1, 0, 0, 0, 0, 1, 0, 1]], dtype=int64)

我们要查找节点1的二阶邻居,那么我们就看这个矩阵的第1行的非0位置,就是1,6,7,8,其中1不算,那么就是6,7,8,是不是非常方便呢?

你可能感兴趣的:(python,图论,python)