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

时间:2018-01-31 13:34:47

标签: python class nodes networkx user-defined

类别定义为(其中还有一些方法,属性和内容,但这是最小的部分):

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)

2 个答案:

答案 0 :(得分:4)

您正在查看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]而不是{{1}来访问的。 }。

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)访问这些条目。

答案 1 :(得分:0)

您添加了node,因此,您可以检查nodes这是类似的视图。引用文档:

  

这些是图中节点,边,邻居(邻接)和节点度的类似集合的视图。它们为图形结构提供了不断更新的只读视图。

例如:

mynodes = list(G.nodes())
print(mynodes)

你现在应该也可以这样做:

mynode = mynodes[0]  # because we have converted the set-like view to a list

请参阅教程:https://networkx.github.io/documentation/stable/tutorial.html