繁体   English   中英

将networkx与我自己的对象一起使用

[英]Using networkx with my own object

我有自己的物品,比如意大利辣香肠。 我有一份来自每个意大利辣香肠和一份辣椒清单的边缘清单。 然后我使用networkx构建一个图形。 我试图找到从一个意大利辣香肠到另一个意大利辣香肠的最短路径的重量。 但是,我收到如下错误,它跟踪来自networkx的内部事物如下:

Traceback (most recent call last):


File "<stdin>", line 1, in <module>
  File "pizza.py", line 437, in shortestPath
    cost = nx.shortest_path_length(a, spepp, tpepp, True)
  File "/Library/Python/2.6/site-packages/networkx-1.3-py2.6.egg/networkx/algorithms/shortest_paths/generic.py", line 181, in shortest_path_length
    paths=nx.dijkstra_path_length(G,source,target)
  File "/Library/Python/2.6/site-packages/networkx-1.3-py2.6.egg/networkx/algorithms/shortest_paths/weighted.py", line 119, in dijkstra_path_length
    (length,path)=single_source_dijkstra(G,source, weight = weight)
  File "/Library/Python/2.6/site-packages/networkx-1.3-py2.6.egg/networkx/algorithms/shortest_paths/weighted.py", line 424, in single_source_dijkstra
    edata=iter(G[v].items())
  File "/Library/Python/2.6/site-packages/networkx-1.3-py2.6.egg/networkx/classes/graph.py", line 323, in __getitem__
    return self.adj[n]
KeyError: <pizza.pepperoni object at 0x100ea2810>

知道什么是错误,或者我必须添加到我的披萨类中才能得到这个KeyError?

编辑:我的边缘格式正确。 我不知道对象是否可以作为节点处理。

如果您将边和节点都作为列表,那么在networkx中构建图表非常简单。 鉴于您在构建图形对象时出现问题,最好的诊断方法是逐步完成networkx中的图形构建:

import networkx as NX
import string
import random

G = NX.Graph()    # initialize the graph

# just generate some synthetic data for the nodes and edges:
my_nodes = [ ch for ch in string.ascii_uppercase ]
my_nodes2 = list(my_nodes)
random.shuffle(my_nodes2)
my_edges = [ t for t in zip(my_nodes, my_nodes2) if not t[0]==t[1] ]

# now add the edges and nodes to the networkx graph object:
G.add_nodes_from(my_nodes)
G.add_edges_from(my_edges)

# look at the graph's properties:
In [87]: len(G.nodes())
Out[87]: 26

In [88]: len(G.edges())
Out[88]: 25

In [89]: G.edges()[:5]
Out[89]: [('A', 'O'), ('A', 'W'), ('C', 'U'), ('C', 'F'), ('B', 'L')]

# likewise, shortest path calculation is straightforward
In [86]: NX.shortest_path(G, source='A', target='D', weighted=False)
Out[86]: ['A', 'W', 'R', 'D']

根据我的经验,Networkx具有非常宽松的界面,特别是它将接受广泛的对象类型作为节点和边缘。 节点可以是除None之外的任何可哈希对象。

我能想到的唯一一件事可能会导致你在Q中出现的错误,也许在你创建图表后你直接操纵了图形对象( dict, * G *),这是你不应该做的 - 有大量的访问方法。

暂无
暂无

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

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