类别定义为(其中还有一些方法,属性和内容,但这是最小的部分):
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)
答案 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