Python';s图形工具:生成第n阶以上的egonet
似乎没有内置函数来生成包含某个节点的所有相邻节点(直到n次)的子图。这个问题也可以被描述为使用n度邻居在节点周围构建一个电子网。让我们考虑下面的玩具例子:Python';s图形工具:生成第n阶以上的egonet,python,graph,graph-tool,Python,Graph,Graph Tool,似乎没有内置函数来生成包含某个节点的所有相邻节点(直到n次)的子图。这个问题也可以被描述为使用n度邻居在节点周围构建一个电子网。让我们考虑下面的玩具例子: from graph_tool.all import * edge_list = [ [('node', 0), ('node', 1), 'xyz'], [('node', 1), ('node', 2)], [('node', 2), ('node', 3)], [('node', 3), ('node'
from graph_tool.all import *
edge_list = [
[('node', 0), ('node', 1), 'xyz'],
[('node', 1), ('node', 2)],
[('node', 2), ('node', 3)],
[('node', 3), ('node', 4), 'abc'],
[('node', 0), ('node', 4)],
[('node', 4), ('node', 5)],
[('node', 5), ('node', 6)],
[('node', 6), ('node', 7)],
[('node', 0), ('node', 8)],
[('node', 7), ('node', 8)],
[('node', 7), ('node', 9)],
[('node', 9), ('node', 10)]
]
g = Graph(directed=False)
我添加了一些属性(顶点和边),以检查它们是否传播到子图:
edge_attributes = g.new_edge_property("string")
g.edge_properties['edge_attributes'] = edge_attributes
nodes_id = g.add_edge_list(edge_list, hashed=True, eprops = [edge_attributes] )
g.vertex_properties['nodes_id'] = nodes_id
bool_flg = g.new_vertex_property('int')
bool_flg.set_value(0)
bool_flg[4] = 1
g.vertex_properties['bool_flg'] = bool_flg
由于我从节点的外部名称开始,例如,('node',0)
(图形工具
库对连续的非负整数进行操作),因此我定义了一个节点id检索函数:
def find_vertex_id(G, node, id_mapping='nodes_id'):
return int(find_vertex(G, G.vertex_properties[id_mapping], node)[0])
def graph_draw_enhanced(graph):
graph_draw(graph, vertex_text=graph.vertex_index,
vertex_fill_color = graph.vertex_properties['bool_flg'])
第一个(也是最耗时的)步骤(基于networkx
解决方案)是生成连接到根节点的节点ID的步骤(满足egonet要求):
我还定义了一个绘图功能:
def find_vertex_id(G, node, id_mapping='nodes_id'):
return int(find_vertex(G, G.vertex_properties[id_mapping], node)[0])
def graph_draw_enhanced(graph):
graph_draw(graph, vertex_text=graph.vertex_index,
vertex_fill_color = graph.vertex_properties['bool_flg'])
对于所提供的示例,我的自定义函数运行良好,但当提供一个包含8M个节点的网络时,该函数的运行速度开始减慢—计算4度egonet大约需要2,5分钟。在图形工具
中,是否有更理想的方法来创建egonet
解决方案应返回一个子图,该子图包含与原始图相同的顶点和边信息
subgraph = generate_subgraph(g, ('node', 0), cutoff=2)
# check for edges
for edge in subgraph.edges():
print(edge, g.edge_properties['edge_attributes'][edge])
# check for nodes
for node in subgraph.vertices():
print(node, g.vertex_properties['bool_flg'][node])
使用graph tool的过滤功能,这实际上更容易做到。下面是一个简单的函数,它生成一个符合顺序的ego网络
n
:
def ego_net(g, ego, n):
d = shortest_distance(g, ego, max_dist=n)
u = GraphView(g, vfilt=d.a < g.num_vertices())
return u
上述方法应该比问题中提出的更快
u = ego_net(g, ego, n)
u = Graph(u, prune=True)