Networkx 公共邻居未正确过滤,未返回正确的邻居列表
Networkx common neighbors not filtering properly, not returning right list of neighbors
我有一个要过滤的测试图
import networkx as nx
import pickle
from pyvis.network import Network
central_node='a'
nono=['a', 'b', 'c', 'd', 'e', 'f', 'g','h','i','j','k']
eded=[('a', 'b'), ('a', 'c'), ('a', 'd'),('a','f'),('b', 'e'),('c', 'e'),('f', 'd'),('a', 'g'),('e','h'),('e','g'),('i','e'),('j','f'),('k','j')]
graph=nx.Graph()
graph.add_nodes_from(nono)
graph.add_edges_from(eded)
net=Network(height='100%', width='100%', bgcolor='white', font_color='black')
net.from_nx(graph)
net.show('test Graph.html')
给出这张图
Full Graph
然后我过滤掉中心节点周围半径 2 以外的所有节点 'a'
subgraph=nx.ego_graph(G=graph,n=central_node, radius=2, center=True)
subnet.from_nx(subgraph)
subnet.show('test SubGraph.html')
给出这张图(到目前为止一切正常)
Sub graph
现在,困难的部分。我试图从子图中保留至少有 3 个节点与我的中心节点 'a' 相同的节点(在我的例子中,节点 'e' 是我唯一想保留的节点)。
for node in subgraph.nodes:
neighbor = nx.common_neighbors(subgraph,central_node,node)
n=len(list(neighbor))
print(node,n)
print(list(neighbor))
for i in sorted(neighbor):
filtered_nodes.extend(i)
if n > 2:
neighbors[node]=n
filtered_nodes.append(node)
filtered_nodes.extend(sorted(neighbor))
并想显示结果图(显示节点 a、b、c、e、g 及其连接边)
但这是结果
filtered_graph=subgraph.subgraph(filtered_nodes)
final_net=Network(height='100%', width='100%', bgcolor='white', font_color='black')
final_net.from_nx(filtered_graph)
final_net.show('Traffic Graph.html')
Final Graph
似乎 common_neighbors 函数执行 return 节点 b、c、g 的列表。每当我尝试打印它时,它都会显示一个空列表。另一方面,它可以正确计算节点与中心节点之间的公共邻居数'a'。
a 5
[]
b 0
[]
c 0
[]
d 1
[]
e 3
[]
f 1
[]
g 0
[]
j 1
[]
我无法正确找出我做错的部分。
common_neighbors function 实际上 return 不是列表 -- 相反,它 return 是一个迭代器,可用于生成列表。结果,当您执行 n=len(list(neighbor))
时,您实际上消耗了迭代器,使其为空。要解决此问题,请在其 return 值上调用 list 并将其保存到变量中:
for node in subgraph.nodes:
neighbor = list(nx.common_neighbors(subgraph, central_node, node))
n = len(neighbor)
print(node, n)
print(neighbor)
for i in sorted(neighbor):
filtered_nodes.extend(i)
if n > 2:
neighbors[node] = n
filtered_nodes.append(node)
filtered_nodes.extend(sorted(neighbor))
我有一个要过滤的测试图
import networkx as nx
import pickle
from pyvis.network import Network
central_node='a'
nono=['a', 'b', 'c', 'd', 'e', 'f', 'g','h','i','j','k']
eded=[('a', 'b'), ('a', 'c'), ('a', 'd'),('a','f'),('b', 'e'),('c', 'e'),('f', 'd'),('a', 'g'),('e','h'),('e','g'),('i','e'),('j','f'),('k','j')]
graph=nx.Graph()
graph.add_nodes_from(nono)
graph.add_edges_from(eded)
net=Network(height='100%', width='100%', bgcolor='white', font_color='black')
net.from_nx(graph)
net.show('test Graph.html')
给出这张图
Full Graph
然后我过滤掉中心节点周围半径 2 以外的所有节点 'a'
subgraph=nx.ego_graph(G=graph,n=central_node, radius=2, center=True)
subnet.from_nx(subgraph)
subnet.show('test SubGraph.html')
给出这张图(到目前为止一切正常)
Sub graph
现在,困难的部分。我试图从子图中保留至少有 3 个节点与我的中心节点 'a' 相同的节点(在我的例子中,节点 'e' 是我唯一想保留的节点)。
for node in subgraph.nodes:
neighbor = nx.common_neighbors(subgraph,central_node,node)
n=len(list(neighbor))
print(node,n)
print(list(neighbor))
for i in sorted(neighbor):
filtered_nodes.extend(i)
if n > 2:
neighbors[node]=n
filtered_nodes.append(node)
filtered_nodes.extend(sorted(neighbor))
并想显示结果图(显示节点 a、b、c、e、g 及其连接边)
但这是结果
filtered_graph=subgraph.subgraph(filtered_nodes)
final_net=Network(height='100%', width='100%', bgcolor='white', font_color='black')
final_net.from_nx(filtered_graph)
final_net.show('Traffic Graph.html')
Final Graph
似乎 common_neighbors 函数执行 return 节点 b、c、g 的列表。每当我尝试打印它时,它都会显示一个空列表。另一方面,它可以正确计算节点与中心节点之间的公共邻居数'a'。
a 5
[]
b 0
[]
c 0
[]
d 1
[]
e 3
[]
f 1
[]
g 0
[]
j 1
[]
我无法正确找出我做错的部分。
common_neighbors function 实际上 return 不是列表 -- 相反,它 return 是一个迭代器,可用于生成列表。结果,当您执行 n=len(list(neighbor))
时,您实际上消耗了迭代器,使其为空。要解决此问题,请在其 return 值上调用 list 并将其保存到变量中:
for node in subgraph.nodes:
neighbor = list(nx.common_neighbors(subgraph, central_node, node))
n = len(neighbor)
print(node, n)
print(neighbor)
for i in sorted(neighbor):
filtered_nodes.extend(i)
if n > 2:
neighbors[node] = n
filtered_nodes.append(node)
filtered_nodes.extend(sorted(neighbor))