繁体   English   中英

在加权图中找到每个节点的输出边数

[英]find the number of output edges of each node in weighted graph

我加载加权图的文本文件。 文本文件包含名为“ 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()

您可以直接使用熊猫来做到这一点。 您可以使用pd.read_csv('path_to_file')读入数据,然后过滤具有正号的边,然后对groupby原点节点进行归并并总结剩余的号。 这是伪造数据的示例:

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

因此,我们将其分为两个观察值。 首先,我们可以使用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 ,以了解发生的事情,有关生成器的更多信息,请从了解Python中的生成器开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM