Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求加权图中每个节点的输出边数_Python_Networkx - Fatal编程技术网

Python 求加权图中每个节点的输出边数

Python 求加权图中每个节点的输出边数,python,networkx,Python,Networkx,我加载加权图的文本文件。文本文件包含三列,分别名为“FromNodeId”、“ToNodeId”和“Sign”。符号是边缘的重量。符号的值为-1或1。我想找到每个节点的“符号=1”的输出边数(输出度)。 请给我建议一个解决这个问题的方法 import networkx as nx G= nx.read_edgelist("soc-sign-epinions.txt",data = [('Sign', int)], create_using=nx.DiGraph()) nodes = G.nod

我加载加权图的文本文件。文本文件包含三列,分别名为“FromNodeId”、“ToNodeId”和“Sign”。符号是边缘的重量。符号的值为-1或1。我想找到每个节点的“符号=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”)读入数据,然后过滤带正号的边,然后按原点节点分组并汇总剩余的符号。下面是一个假数据的示例:

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

你可以直接用熊猫来做。您可以使用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

我们将把它分解为两个观察结果。首先,我们可以使用
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
开始的边,并包含附加到边上的数据。(在您的最终代码中,显然您并不真正想要这个print语句)

现在我们将在生成器中使用它,并将元素数相加

s = sum(1 for (u,v,d) in G.edges(0, data=True) if d['sign']==1)
print(s)
> 1
我所做的是创建一个生成器,它通过
0
的所有边,如果符号是
1
,它将向输出中添加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
开始的边,并包含附加到边上的数据。(在您的最终代码中,显然您并不真正想要这个print语句)

现在我们将在生成器中使用它,并将元素数相加

s = sum(1 for (u,v,d) in G.edges(0, data=True) if d['sign']==1)
print(s)
> 1
我所做的是创建一个生成器,它通过
0
的所有边,如果符号是
1
,它将向输出中添加1


如果最后一句话没有意义,请看下面的答案:要了解正在发生的事情,以及有关生成器的更多信息,请从开始。

不是
G.degree(node)
如果是有向图,请给出outdegree?我可以在有向图中使用G.out\u degree(node)。但是我想为每个节点计算出Sign=1或Sign=-1的边。如果它有a,回答起来会快一点-特别是,我没有soc-Sign-epinions.txt,所以我不能只是复制和粘贴代码。如果是有向图,不是
G.degree(node)
给出outdegree吗?我可以在有向图中使用G.out\u degree(node)。但我想为每个节点计算出符号为1或符号为-1的边。如果它有一个-特别是,我没有soc-Sign-epinions.txt,那么回答起来会快一点,所以我不能只是复制和粘贴代码。这需要先从networkx图到pandas图,如果用户只需要一个节点的信息,这可能会导致效率低下。如果用户只需要这些信息并且正在从txt文件中读取,则可以完全避免networkx。如果他或她需要图形结构,那么您是对的。这需要先从networkx图形转到pandas,如果用户只需要单个节点的信息,这可能是低效的。如果用户只需要这些信息并从txt文件中读取,则可以完全避免networkx。如果他或她需要图形结构,那么你是对的。