gpt4 book ai didi

python - 如何使用用户定义的类对象作为 networkx 节点?

转载 作者:太空狗 更新时间:2023-10-29 21:45:08 25 4
gpt4 key购买 nike

类点定义为(里面还有一些方法、属性等,但这是最小的部分):

class point():
def ___init___(self, x, y):
self.x = x
self.y = y

所以,我看到了this question ,但是当我尝试应用它时,它返回一个错误:

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.node[]G.nodes[] - 在 2.4 版中 G.node已弃用。

您正在查看 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'] .

关于python - 如何使用用户定义的类对象作为 networkx 节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48543460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com