【问题标题】:find the number of output edges of each node in weighted graph在加权图中找到每个节点的输出边数
【发布时间】:2019-04-04 19:53:18
【问题描述】:

我加载了加权图的文本文件。该文本文件包含名为“FromNodeId”、“ToNodeId”和“Sign”的三列。符号是边缘的重量。 Sign 的值为 -1 或 1。我想找到每个节点的“Sign=1”的输出边数(输出度数)。 请建议我解决此问题的方法。

import networkx as nx
G= nx.read_edgelist("soc-sign-epinions.txt",data = [('Sign', int)], create_using=nx.DiGraph())

nodes = G.nodes()
edges = G.edges()

【问题讨论】:

  • 如果是有向图,G.degree(node) 不给出出度吗?
  • 我可以在有向图中使用 G.out_degree(node)。但我想为每个节点计算 Sign =1 或 Sign =-1 的边缘。
  • 如果它有 minimal reproducible example 会更快回答 - 特别是,我没有 soc-sign-epinions.txt,所以我不能只是复制和粘贴你的代码。

标签: python networkx


【解决方案1】:

因此,我们将把它分解为两个观察结果。首先,我们可以使用G.edges(node, data = True) 访问节点外的所有边(以及相关数据)。其次,有一些方法可以有效地遍历这些边缘,只计算那些带有正号的边缘。更一般地说,这种方法可用于计算节点外具有任何特定属性的边数。

import networkx as nx


G = nx.DiGraph()
G.add_edge(0,2,sign=-1)
G.add_edge(0,1, sign = 1)
G.add_edge(2,3,sign = 1)
G.add_edge(3,0, sign=-1)
print(G.edges(0, data=True))
>[(0, 2, {'sign': -1}), (0, 1, {'sign': 1})]

请注意,边缘 (3,0) 没有出现在这里。所以G.edges(0, data=True) 会产生从0 开始的边缘,并包含您附加到边缘的数据。 (在您的最终代码中,显然您实际上并不需要此打印语句)。

现在我们将在生成器中使用它并总结元素的数量。

s = sum(1 for (u,v,d) in G.edges(0, data=True) if d['sign']==1)
print(s)
> 1

我所做的是创建一个生成器,它遍历0 之外的所有边,如果符号为1,它会将 1 添加到输出中。

如果最后一句话没有意义,请查看此答案:https://stackoverflow.com/a/7223557/2966723 以了解正在发生的事情,有关生成器的更多信息,请从 Understanding generators in Python 开始。

【讨论】:

    【解决方案2】:

    您可以直接使用 pandas 来执行此操作。您可以使用 pd.read_csv('path_to_file') 读取数据,然后过滤带有正号的边,然后按原始节点分组并总结剩余的符号。这是一个假数据的例子:

    import pandas as pd
    data=pd.DataFrame([['a','b',1],
                  ['a','c',-1],
                  ['a','d',1],
                  ['b','a',1],
                  ['b','d',-1],
                  ['c','a',1],
                  ['d','b',1]],
                   columns = ["FromNodeId", "ToNodeId","Sign"])
    data[data['Sign']==1].groupby('FromNodeId')['Sign'].sum()
    

    返回:

    FromNodeId
    a    2
    b    1
    c    1
    d    1
    Name: Sign, dtype: int64
    

    【讨论】:

    • 这需要先从networkx图转到pandas,如果用户只想要单个节点的信息,这可能是低效的。
    • 如果用户只需要这些信息并且正在从 txt 文件中读取,则可以完全避免使用 networkx。如果他或她需要图形结构,那么你是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多