networkx 有向图属性错误 self._succ
networkx DiGraph Attribute Error self._succ
上下文:我正在尝试 运行 另一位研究人员的代码 - 它描述了湾区道路网络的交通模型,该模型受到地震灾害的影响。我是 Python 的新手,因此非常感谢您帮助我调试以下错误。
问题:当我按照 README 中的说明尝试 运行 文件随附示例数据的代码时,出现以下错误。
DN0a226926:quick_traffic_model gitanjali$ python mahmodel_road_only.py
You are considering 2 ground-motion intensity maps.
You are considering 1743 different site locations.
You are considering 2 different damage maps (1 per ground-motion intensity map).
Traceback (most recent call last):
File "mahmodel_road_only.py", line 288, in <module>
main()
File "mahmodel_road_only.py", line 219, in main
G = get_graph()
File "mahmodel_road_only.py", line 157, in get_graph
G = add_superdistrict_centroids(G)
File "mahmodel_road_only.py", line 46, in add_superdistrict_centroids
G.add_node(str(1000000 + i))
File "/Library/Python/2.7/site-packages/networkx-2.0-py2.7.egg/networkx/classes/digraph.py", line 412, in add_node
if n not in self._succ:
AttributeError: 'DiGraph' object has no attribute '_succ'
调试:根据其他一些问题,这个错误似乎源于 networkx 版本(我使用的是 2.0)或 Python版本(我使用的是 2.7.10)。我检查了 the migration guide cited in other questions,在 mahmodel_road_only.py 中没有发现我需要更改的内容。我还检查了digraph.py文件,发现定义了self._succ。我还检查了 get_graph() 的定义,如下所示,它调用了 networkx,但没有发现任何明显的问题。
def get_graph():
import networkx
'''loads full mtc highway graph with dummy links and then adds a few
fake centroidal nodes for max flow and traffic assignment'''
G = networkx.read_gpickle("input/graphMTC_CentroidsLength3int.gpickle")
G = add_superdistrict_centroids(G)
assert not G.is_multigraph() # Directed! only one edge between nodes
G = networkx.freeze(G) #prevents edges or nodes to be added or deleted
return G
问题: 我该如何解决这个问题?是更改 Python 还是 Networkx 版本的问题?如果没有,您可以推荐哪些后续步骤进行调试?
我认为您的问题与 AttributeError: 'DiGraph' object has no attribute '_node'
中的问题类似
问题是被调查的图表是在 networkx 1.x 中创建的,然后被 pickle。然后该图具有 networkx 1.x 对象所具有的属性。我相信这也发生在你身上。
您现在已经打开它,并且正在将 networkx 2.x 中的工具应用于该图。但是这些工具假定它是一个 networkx 2.x 有向图,具有 2.x 有向图中预期的所有属性。特别是它希望为节点定义 _succ
,而 1.x DiGraph 没有。
所以这里有两种我认为可行的方法:
短期解决方案
删除 networkx 2.x 并替换为 networkx 1.11.
这不是最优的,因为 networkx 2.x 更强大。此外,为在 2.x 和 1.x 中工作而编写的代码(遵循您提到的迁移指南)在 1.x 中的效率较低(例如,在某些地方 1.x 代码使用列表,2.x 代码使用生成器)。
长期解决方案
将 1.x 图表转换为 2.x 图表(我无法轻松测试,因为目前我的电脑上没有 1.x - 如果有人尝试过,请发表评论说这是否有效以及您的网络是否加权):
#you need commands here to load the 1.x graph G
#
import networkx as nx #networkx 2.0
H = nx.DiGraph() #if it's a DiGraph()
#H=nx.Graph() #if it's a typical networkx Graph().
H.add_nodes_from(G.nodes(data=True))
H.add_edges_from(G.edges(data=True))
data=True
用于确保保留任何 edge/node 权重。 H
现在是一个 networkx 2.x 有向图,边和节点具有 G
具有的任何属性。 networkx 2.x 命令应该可以处理它。
额外的长期解决方案
联系其他研究人员并警告 him/her 该代码示例现已过时。
上下文:我正在尝试 运行 另一位研究人员的代码 - 它描述了湾区道路网络的交通模型,该模型受到地震灾害的影响。我是 Python 的新手,因此非常感谢您帮助我调试以下错误。
问题:当我按照 README 中的说明尝试 运行 文件随附示例数据的代码时,出现以下错误。
DN0a226926:quick_traffic_model gitanjali$ python mahmodel_road_only.py
You are considering 2 ground-motion intensity maps.
You are considering 1743 different site locations.
You are considering 2 different damage maps (1 per ground-motion intensity map).
Traceback (most recent call last):
File "mahmodel_road_only.py", line 288, in <module>
main()
File "mahmodel_road_only.py", line 219, in main
G = get_graph()
File "mahmodel_road_only.py", line 157, in get_graph
G = add_superdistrict_centroids(G)
File "mahmodel_road_only.py", line 46, in add_superdistrict_centroids
G.add_node(str(1000000 + i))
File "/Library/Python/2.7/site-packages/networkx-2.0-py2.7.egg/networkx/classes/digraph.py", line 412, in add_node
if n not in self._succ:
AttributeError: 'DiGraph' object has no attribute '_succ'
调试:根据其他一些问题,这个错误似乎源于 networkx 版本(我使用的是 2.0)或 Python版本(我使用的是 2.7.10)。我检查了 the migration guide cited in other questions,在 mahmodel_road_only.py 中没有发现我需要更改的内容。我还检查了digraph.py文件,发现定义了self._succ。我还检查了 get_graph() 的定义,如下所示,它调用了 networkx,但没有发现任何明显的问题。
def get_graph():
import networkx
'''loads full mtc highway graph with dummy links and then adds a few
fake centroidal nodes for max flow and traffic assignment'''
G = networkx.read_gpickle("input/graphMTC_CentroidsLength3int.gpickle")
G = add_superdistrict_centroids(G)
assert not G.is_multigraph() # Directed! only one edge between nodes
G = networkx.freeze(G) #prevents edges or nodes to be added or deleted
return G
问题: 我该如何解决这个问题?是更改 Python 还是 Networkx 版本的问题?如果没有,您可以推荐哪些后续步骤进行调试?
我认为您的问题与 AttributeError: 'DiGraph' object has no attribute '_node'
中的问题类似问题是被调查的图表是在 networkx 1.x 中创建的,然后被 pickle。然后该图具有 networkx 1.x 对象所具有的属性。我相信这也发生在你身上。
您现在已经打开它,并且正在将 networkx 2.x 中的工具应用于该图。但是这些工具假定它是一个 networkx 2.x 有向图,具有 2.x 有向图中预期的所有属性。特别是它希望为节点定义 _succ
,而 1.x DiGraph 没有。
所以这里有两种我认为可行的方法:
短期解决方案 删除 networkx 2.x 并替换为 networkx 1.11.
这不是最优的,因为 networkx 2.x 更强大。此外,为在 2.x 和 1.x 中工作而编写的代码(遵循您提到的迁移指南)在 1.x 中的效率较低(例如,在某些地方 1.x 代码使用列表,2.x 代码使用生成器)。
长期解决方案 将 1.x 图表转换为 2.x 图表(我无法轻松测试,因为目前我的电脑上没有 1.x - 如果有人尝试过,请发表评论说这是否有效以及您的网络是否加权):
#you need commands here to load the 1.x graph G
#
import networkx as nx #networkx 2.0
H = nx.DiGraph() #if it's a DiGraph()
#H=nx.Graph() #if it's a typical networkx Graph().
H.add_nodes_from(G.nodes(data=True))
H.add_edges_from(G.edges(data=True))
data=True
用于确保保留任何 edge/node 权重。 H
现在是一个 networkx 2.x 有向图,边和节点具有 G
具有的任何属性。 networkx 2.x 命令应该可以处理它。
额外的长期解决方案 联系其他研究人员并警告 him/her 该代码示例现已过时。