【问题标题】:Get nodes of specific type in Networkx [duplicate]在Networkx中获取特定类型的节点[重复]
【发布时间】:2016-02-12 04:52:51
【问题描述】:

所以我使用 networkX 图来表示一些信息。此信息由不同的对象类型(例如,ColorNode 和 ShapeNode)表示。

在此图上完成的一些处理需要我提取出特定类型的节点。每次我需要这样做时,我都会按照下面的代码行做一些事情。

colornodes = []
for node in graph.nodes():
    if isinstance(node, ColorNode):
        colornodes.append()

虽然这可行,但我觉得这是在处理图表时经常出现的情况,我正在那里重新发明轮子。 本质上,我想知道是否有更好的方法来做到这一点。

【问题讨论】:

  • @Joel 感谢您指出这一点。如果我点击“解决了我的问题”,其他人仍然可以看到问题吗?问主要是因为 Kikohs 答案中的替代方法非常有价值,我不想放弃它。
  • 是的 - 它看起来像这样:stackoverflow.com/questions/12231644/… 这个问题及其答案将保留,并且指向另一个页面的链接将突出显示(并且另一个页面将在侧边栏上有一个链接本页)。

标签: python graph networkx


【解决方案1】:

我建议另一种方法,而不是定义自己的类型并始终检查isinstance(这非常慢)。

您可以查看此answer 以了解经典节点/边缘过滤。

但是我发现另一个技巧可能对您的具体情况派上用场。

如果您定义了一个代表节点类型的属性,您可以使用以下方法查询具有该特定属性的节点 内置get_node_attributes 函数。诀窍是它只返回真正定义属性的节点:

import networkx as nx

G = nx.complete_graph(10)
G.node[0]['ColorNode'] = True  # right-hand side value is irrelevant for the lookup
G.node[1]['ColorNode'] = True
G.node[2]['ShapeNode'] = True
G.node[3]['ShapeNode'] = True

shape_nodes = nx.get_node_attributes(G, 'ShapeNode').keys()
color_nodes = nx.get_node_attributes(G, 'ColorNode').keys()

print('Shape node ids: {}'.format(shape_nodes))
print('Color node ids: {}'.format(color_nodes))

输出:

Shape node ids: [2, 3]
Color node ids: [0, 1]

当然,如果您的图表很大或静态,您应该保留 id 列表以便快速查询!

【讨论】:

  • 干杯,这是一个非常巧妙的想法!
【解决方案2】:

而不是graph.nodes(), 你可以使用 xpath。

【讨论】:

  • 抱歉,我可能在这里遗漏了一些明显的东西,但是 xpath 是 networkx 的一部分吗?我似乎在 networkx 文档中找不到与 xpath 相关的任何内容
  • 是的,比如 ---- 对于 graph.xpath(....) 中的节点
  • 你能澄清你的答案@sneha
  • @sneha 如果graph 是networkx 图,那么graph.xpath 是未定义的。
  • 例如:def edges(): for node in root.xpath('//n:node', namespaces = { 'n' : root.nsmap[None] }): node_id = int (node.attrib['id']) for edge in node.xpath('./n:children/n:nodeRef/@rid', namespaces = { 'n' : root.nsmap[None] }): yield ( node_id, int(edge))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2012-07-26
  • 1970-01-01
  • 2012-11-28
相关资源
最近更新 更多