文章目录
- 前言
- 手动
- 高级
前言
一般情况下,貌似这些图之类的包,只提供查询一个节点的一阶邻居,但是有的时候我们需要二阶甚至三阶,那么该如何做呢?
注意一下,本文的方法仅可以针对二阶或者三阶,更高阶的代码没有提供。
假设有下面这个图。
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)])
手动
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,是不是非常方便呢?