从节点邻域返回最大节点

时间:2012-04-09 23:27:55

标签: python networkx

我希望通过由n个节点组成的图G。并且对于每个第n个节点打开其邻居的字典。找出哪个邻居具有最大的数字属性。可能至少有100个邻居。并返回每个节点及其最大邻居的列表,即

[node,biggestneighbor]
[node,biggestneighbor]
[node,biggestneighbor]

节点的属性数据如下所示:

G.node[0]

{'type': 'a', 'pos': [0.76, 0.11]}

我感兴趣的属性是

G.node[0]['pos'][0]

0.76

有谁知道这是否存在?或者如果不是,启动逻辑看起来像一个好的起点?还是一个聪明的人有更好的主意?

def thebiggestneighbor(G,attribute,nodes=None):

    if nodes is None:
        node_set = G
    else:
        node_set = G.subgraph(nodes)
    node=G.node
    for u,nbrsdict in G.adjacency_iter():
        if u not in node_set:
            continue
            for v,eattr in nbrsdict.items():
                vattr=node[v].get(attribute,None)
          #  then something like this but for many nodes. probably better subtraction 
          #  of all nodes from each other and which one yeilds the biggest numner
          #  
          #  if x.[vattra] > x.[vattrb]  then
          #      a
          #  elif x.[vattra] < x.[vattrb] then
          #      b 

            yield (u,b)

2 个答案:

答案 0 :(得分:2)

我喜欢用正确的数据结构来解决这样的问题:

#nodes = [ (att_n, [(att_n, n_idx).. ] ), ... ]  where each node is known by its index
#in the outer list. Each node is represented with a tuple: att_n the numeric attribute, 
#and a list of neighbors. Neighbors have their numeric attribute repeated
#eg. node 1 has neighbors 2, and 3. node 2 has neighbor 1 and 4, etc..: 
nodes = [ (192, [ (102, 2), (555, 3)] ), 
          (102, [ (192, 1), (333, 4) ] ), 
          (555, [ (192, 1),] ), ... 
    ]  
#then to augment nodes so the big neighbor is visible:
nodesandbigneighbor=[ (att_n, neighbors, max(neighbors)) for att_n, neighbors in nodes]  

此外,如果您将邻居列表的排序顺序从低数字属性维护为高,那么您可以执行以下操作:

nodesandbigneighbor=[ (att_n, neighbors, neighbors[-1]) for att_n, neighbors in nodes]  

会更快(以节点插入时间为代价),但是你在插入时有效地解决了这个问题。

答案 1 :(得分:0)

我真的没有看到问题,你会通过遍历所有节点并且foreach节点迭代它的邻居来做O(n * m)[n =节点,m = avg(邻居)]操作。最坏的情况是O(n ^ 2)。你也有一个缩进问题,因为你的大多数代码都在“continue”语句之后,所以它不会被执行。

代码示例

node=G.node
output=[]
for u,nbrsdict in G.adjacency_iter():
    if u not in node_set:
        continue
    max={'value':0,'node':None}
    for v,eattr in nbrsdict.items():
        vattr=node[v].get(attribute,None)
        if vattr>max['value']:
            max={'value':vattr,'node':node}
    output.append((node,max['node']))
return output