继承 networkx Graph 并使用 nx.connected_component_subgraphs
inheriting networkx Graph and using nx.connected_component_subgraphs
我正在尝试子class networkx Graph 对象。我的 __init__
有一个变量传递给它。但是,这意味着当我尝试使用以下调用 connected_component_iter
、
的方法时
def connected_component_iter(self):
"""
Yields connected components.
"""
assert self.is_built is True
for subgraph in nx.connected_component_subgraphs(self):
yield subgraph
我收到这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "src/unitigGraph.py", line 163, in connected_component_iter
def connected_component_iter(self):
File "/Library/Python/2.7/site-packages/networkx/algorithms/components/connected.py", line 94, in connected_component_subgraphs
yield G.subgraph(c).copy()
File "/Library/Python/2.7/site-packages/networkx/classes/graph.py", line 1486, in subgraph
H = self.__class__()
TypeError: __init__() takes exactly 2 arguments (1 given)
我真的不想删除我的初始化 class 变量。有没有办法我仍然可以使用 Graph
中的 connected_component_iter
方法?
您可以通过为新的初始化变量 val
提供默认值来解决此问题:
class MyGraph(nx.Graph):
def __init__(self, data=None, val=None, **attr):
super(MyGraph, self).__init__()
self.val = val
以上,val
的默认值为 None。所以
H = self.__class__()
将初始化一个 val
等于 None
的新子图。
但是,您似乎希望子图继承相同的值
val
作为父 MyGraph。在这种情况下,我们需要更改
H = self.__class__()
到
H = self.__class__(val=self.val)
我们可以通过在 MyGraph
中定义稍作改动的版本来覆盖 the subgraph
method 来实现这一点。例如,代码可能类似于:
import networkx as nx
class MyGraph(nx.Graph):
def __init__(self, data=None, val=None, **attr):
super(MyGraph, self).__init__()
self.val = val
self.is_built = True
def connected_component_iter(self):
"""
Yields connected components.
"""
assert self.is_built is True
for subgraph in nx.connected_component_subgraphs(self):
yield subgraph
def subgraph(self, nbunch):
bunch =self.nbunch_iter(nbunch)
# create new graph and copy subgraph into it
H = self.__class__(val=self.val)
# copy node and attribute dictionaries
for n in bunch:
H.node[n]=self.node[n]
# namespace shortcuts for speed
H_adj=H.adj
self_adj=self.adj
# add nodes and edges (undirected method)
for n in H.node:
Hnbrs={}
H_adj[n]=Hnbrs
for nbr,d in self_adj[n].items():
if nbr in H_adj:
# add both representations of edge: n-nbr and nbr-n
Hnbrs[nbr]=d
H_adj[nbr][n]=d
H.graph=self.graph
return H
G = MyGraph(val='val')
G.add_edges_from([(0, 1), (1, 2), (1, 3), (3, 5), (3, 6), (3, 7), (4, 8), (4, 9)])
for subgraph in G.connected_component_iter():
print(subgraph.nodes(), subgraph.val)
我正在尝试子class networkx Graph 对象。我的 __init__
有一个变量传递给它。但是,这意味着当我尝试使用以下调用 connected_component_iter
、
def connected_component_iter(self):
"""
Yields connected components.
"""
assert self.is_built is True
for subgraph in nx.connected_component_subgraphs(self):
yield subgraph
我收到这个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "src/unitigGraph.py", line 163, in connected_component_iter
def connected_component_iter(self):
File "/Library/Python/2.7/site-packages/networkx/algorithms/components/connected.py", line 94, in connected_component_subgraphs
yield G.subgraph(c).copy()
File "/Library/Python/2.7/site-packages/networkx/classes/graph.py", line 1486, in subgraph
H = self.__class__()
TypeError: __init__() takes exactly 2 arguments (1 given)
我真的不想删除我的初始化 class 变量。有没有办法我仍然可以使用 Graph
中的 connected_component_iter
方法?
您可以通过为新的初始化变量 val
提供默认值来解决此问题:
class MyGraph(nx.Graph):
def __init__(self, data=None, val=None, **attr):
super(MyGraph, self).__init__()
self.val = val
以上,val
的默认值为 None。所以
H = self.__class__()
将初始化一个 val
等于 None
的新子图。
但是,您似乎希望子图继承相同的值
val
作为父 MyGraph。在这种情况下,我们需要更改
H = self.__class__()
到
H = self.__class__(val=self.val)
我们可以通过在 MyGraph
中定义稍作改动的版本来覆盖 the subgraph
method 来实现这一点。例如,代码可能类似于:
import networkx as nx
class MyGraph(nx.Graph):
def __init__(self, data=None, val=None, **attr):
super(MyGraph, self).__init__()
self.val = val
self.is_built = True
def connected_component_iter(self):
"""
Yields connected components.
"""
assert self.is_built is True
for subgraph in nx.connected_component_subgraphs(self):
yield subgraph
def subgraph(self, nbunch):
bunch =self.nbunch_iter(nbunch)
# create new graph and copy subgraph into it
H = self.__class__(val=self.val)
# copy node and attribute dictionaries
for n in bunch:
H.node[n]=self.node[n]
# namespace shortcuts for speed
H_adj=H.adj
self_adj=self.adj
# add nodes and edges (undirected method)
for n in H.node:
Hnbrs={}
H_adj[n]=Hnbrs
for nbr,d in self_adj[n].items():
if nbr in H_adj:
# add both representations of edge: n-nbr and nbr-n
Hnbrs[nbr]=d
H_adj[nbr][n]=d
H.graph=self.graph
return H
G = MyGraph(val='val')
G.add_edges_from([(0, 1), (1, 2), (1, 3), (3, 5), (3, 6), (3, 7), (4, 8), (4, 9)])
for subgraph in G.connected_component_iter():
print(subgraph.nodes(), subgraph.val)