如何使用用户定义的类对象作为networkx节点?
问题内容:
类点的定义为(其中还包含一些方法,属性和东西,但这是最少的一部分):
class point():
def ___init___(self, x, y):
self.x = x
self.y = y
因此,我看到了这个问题,但是当我尝试应用它时,它返回一个错误:
G = nx.Graph()
p = point(0,0)
G.add_node(0, p)
NetworkXError:attr_dict参数必须是字典。
如果我用
G = nx.Graph()
p = point(0,0)
G.add_node(0, data = p)
我没有收到错误,但是当我尝试访问x坐标时,事实证明并没有将其保存为点。
G[0].x
返回:AttributeError:’dict’对象没有属性’x’
在做
G = nx.Graph()
G.add_node(0, data = point(0,0))
G[0]
返回:{}
这意味着它仍将其保存为字典。
我看到我可以使点成为可散列的,并将这些对象用作节点,所以我添加了属性ID,因为点将移动。我将此添加到类中,并__repr__来绘制漂亮的图形:
def __hash__(self):
return self.id_n
def __cmp__(self, p):
if self.id_n < p.id_n: return -1
elif self.id_n == p.id_n: return 0
else: return 1
def __eq__(self, p):
if p.id_n == self.id_n: return True
else: return False
def __repr__(self):
return str(self.id_n)
但这有点奇怪,因为那时我不知道如何选择节点,
G[<what should i put here?>]
因此,问题是,执行此操作的正确方法是什么?
我希望能够使用类似
G[node_id].some_method(some_args)
问题答案:
你在看G[0]
。但这不是您想要的。 G[0]
包含有关节点的邻居0
和边的属性的信息,但不包含有关节点的属性的信息0
。
class point():
def __init__(self, x, y):
self.x = x
self.y = y
import networkx as nx
G = nx.Graph()
p0 = point(0,0)
p1 = point(1,1)
G.add_node(0, data=p0)
G.add_node(1, data=p1)
G.add_edge(0,1, weight=4)
G[0]
> AtlasView({1: {'weight': 4}}) #in networkx 1.x this is actually a dict. In 2.x it is an "AtlasView"
对于networkx,期望一个节点可能有很多与其关联的数据。在您的情况下,您只有一条数据,即该点。但是您可能还已经指定了颜色,权重,时间,年龄等。因此,networkx将所有属性存储在另一个字典中,但是该字典是通过G.node[0]
而不是通过访问的G[0]
。
G.node[0]
> {'data': <__main__.point at 0x11056da20>}
G.node[0]['data'].x
> 0
请注意,data
您输入的内容将成为字符串'data'
。
输入像这样的节点可能会更好G.add_node(0, x=0, y=0)
,然后您可以按那样访问条目G.node[0]['x']
。