По заданному значению выберите атрибут с помощью Networkx.питон - PullRequest
0 голосов
/ 31 декабря 2018

как вы говорите Networkx, что, учитывая атрибут, выбрать другой?Точнее, у меня есть следующие данные:

Final_s1 = G.node[node]['s1']
Initial_s1 = G.node['a']['s1']

Final_s2 = G.node[node]['s2']
Initial_s2 = G.node['a']['s2']

Я выполняю несколько простых вычислений

Perf_s1 = (Final_s1 - Initial_s1)/Initial_s1
Perf_s2 = (Final_s2 - Initial_s2)/Initial_s2

Я хотел бы посмотреть, есть ли способ пропустить следующие две строки:

G.node[node]['Perf_s1'] = Perf_s1
G.node[node]['Perf_s2'] = Perf_s2

Далее я нахожу минимум между обоими «выступлениями»:

min_node = min(['Perf_s1', 'Perf_s2'], key=lambda x: G.node[node][x])

В этой последней части я хочу научиться программировать лучше.Это работает, но необходимость добавления двух дополнительных атрибутов и оператора if-else выглядит не лучшим образом.

if min_node == 'Perf_s1':
    Initial_Worst = G.node['a']['s1']
    Final_Worst = G.node[node]['s1']
    G.node[node]['value'] = Initial_Worst * Final_Worst
else:
    Initial_Worst = G.node['a']['s2']
    Final_Worst = G.node[node]['s2']
    G.node[node]['value'] = Initial_Worst*Final_Worst

Спасибо!

1 Ответ

0 голосов
/ 31 декабря 2018

Networkx не поддерживает такого рода вычисления "из коробки" (и не без причины).Атрибуты узлов просто хранятся в виде словаря, сопоставляя имена атрибутов со значениями.То, что вы делаете, может быть сделано более общим способом с простым кодом Python.Вот мое предложение:

import random
import networkx as nx

# Generate a random graph with some values for s1 and s2:
G = nx.erdos_renyi_graph(10, 0.25)
nx.set_node_attributes(G, {node: {'s1': random.randint(0, 100), 's2': random.randint(0, 100)} for node in G.nodes()})
# Choose some node 'a' (the initial node):
a = 0
# Define the metrics we are interested at:
metrics = ['s1','s2']
# For each node compute and add the value:
for node in G.nodes():
    # Compute the metrics (i.e., Perf_s1 and Perf_s2), keep in a dictionary:
    metrics_dict = {metric: (G.node[node][metric] - G.node[a][metric]) / G.node[a][metric] for metric in metrics}
    # Get the metric that minimizes the desired value (e.g., 's1'):
    arg_min = min(metrics_dict, key=metrics_dict.get)
    # Add as an attribute to the graph under 'value':
    nx.set_node_attributes(G, {node : {'value': G.node[node][arg_min] * G.node[a][arg_min]}})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...