Простой способ изменения атрибутов отдельных узлов в Networkx 2.1+ - PullRequest
0 голосов
/ 28 ноября 2018

Я ищу простой способ изменения значения одного атрибута одного узла внутри графика NetworkX.

В документации NetworkX упоминается только функция для установки атрибута для всех узлов вграфик, например:

nx.set_node_attributes(G, bb, 'betweenness')

Это может быть целесообразно во многих ситуациях, когда такой такой атрибут легко рассчитать для всех узлов в графе (как, например, упомянуто между).Аналогично, в NetworkX есть простой способ доступа к атрибутам одного узла:

graph.nodes[nodeName][attribute]

Однако атрибуты, доступные таким способом, доступны только для чтения.

Так что я ищуспособ установить атрибуты так же просто, как чтение.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 ноября 2018

В вашем примере bb - это диктовка, ключами которой являются узлы.Вам не нужно, чтобы dict имел ключ для всех узлов в графе, а только для узлов, для которых вы хотите определить атрибут.В приведенном ниже примере я создаю график, а затем устанавливаю 'weight' узла 0 равным 5 и узла 3 равным 2.Это оставляет атрибуты для других узлов незатронутыми, поэтому, поскольку они никогда не создавались, они не существуют.

import networkx as nx
G = nx.fast_gnp_random_graph(10,0.2)
nx.set_node_attributes(G, {0:5, 3:2}, 'weight')
G.nodes[0]['weight']
> 5
G.nodes[3]['weight']
> 2
G.nodes[1]['weight']
> KeyError: 'weight'

Поэтому мы устанавливаем вес для 0 и 3, но не для любыхиз других.Вы также можете установить более одного атрибута одновременно, но для этого требуется немного другой вызов.Здесь мы имеем

nx.set_node_attributes(G, {1:{'weight':-1, 'volume':4}})
G.nodes[1]['weight']
> -1
G.nodes[1]['volume']
> 4

Просто чтобы посмотреть, как выглядят атрибуты после всего этого:

G.nodes(data=True)
> NodeDataView({0: {'weight': 5}, 1: {'weight': -1, 'volume': 4}, 2: {}, 3: {'weight': 2}, 4: {}, 5: {}, 6: {}, 7: {}, 8: {}, 9: {}})
...