簡體   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