2016-01-12 4 views
0

все. Я создаю DiGraph, используя NetworkX и повторяя алгоритм над ним. В конкретной итерации каждый узел «n» изменяет определенный атрибут, скажем, «A_n». Теперь каждое ребро относительно этого конкретного узла «n» и данного предшественника «m» имеет другой интересный атрибут, который зависит от «A_n», назовем его «B_mn». Мой вопрос: возможно ли обновить «B_mn» «автоматически», изменив «A_n» для всех «n», «m» в моем наборе узлов? Я имею в виду, не повторяя узлы, а затем над их предшественниками, но используя какую-то динамическую функцию «B_mn (A_n)», которая меняет свое значение в тот момент, когда изменяется «A_n». Это возможно?Python's Networkx, обновляющие атрибуты «автоматически»

Я думал в чем-то вроде этого:

Пусть X и Y быть числами, давайте предположим, что

G.node [ "п"] [ "A"] = X и G.edge [» m "] [" n "] [" B "] = Y + G.node [" n "] [" A "]

Я хочу, чтобы, изменив значение X, значение атрибута« B » «в краю тоже будет обновлено.

Большое спасибо заранее за вашу помощь :)

+0

Я не совсем понял, что вы хотите [но решение этого вопроса может помочь вам] (https://stackoverflow.com/questions/29800722/can-be-saved-into-a-variable-one- состояние). – Macabeus

+0

Вы в порядке с атрибутом B, просто являющимся функцией, которая оценивается каждый раз, когда вы пытаетесь получить к ней доступ (в зависимости от того, что вы делаете, это может быть дорогостоящим, если оценивать много раз), или вы действительно хотите, чтобы это было определенное значение, которое обновляется каждый раз, когда узел изменяется (в зависимости от того, что вы делаете, это может быть дорого, если вес узлов сильно изменяется, а кромки не часто доступны). Первое относительно просто. Второй труднее. – Joel

ответ

0

Одна проблема с этим вопросом -> Никогда не удалять узлы.

В вашем примере вы назначаете X в G.node ["n"] ["A"]. Если вы говорите:

G.node["n"]["A"] = 5 
G.node["n"]["A"] = 6 

, разрушающих'S местоположения данных и теперь G.node [ «п»] [ «A»] указывает на новый объект с новой ячейке памяти.

Вместо назначения типа '=' вам нужно сделать обновление X. Который оставит тип данных и место на карте памяти на месте. Это означает, что вам нужен тип данных, который поддерживает «.update()», как словарь.

Все прошлое здесь зависит от вашего случая использования:


Если данные узла значение (как межд или поплавок), то вы не имеете проблему, добавляя их вместе. Вы можете продолжать выполнять вычисления на основе добавления значений изменений только на 1 уровень глубже, чем выполняется расчет.

Однако, если данные узла являются выражением выражений ... пример G.node.get ('n') ['A'] + G.node.get ('m') ['A'] (который G.node.get ('т') [ 'A'] также является выражением, которое должно быть оценено.)

, то вы один из 2-х проблем:

  • Вам нужно будет рекурсивная функция, которая выполняет оценку ИЛИ
  • Вам нужно будет сохранить список словарей вне Графа и выполнить текущую оценку там, которая обновит значения данных в Графе.

можно сделать все это в графике, используя что-то вроде ast.literal_eval() (предупреждение это не очень хорошая идея)

Если у вас есть только одна операция для выполнения (дополнение?), То есть некоторые трюки, которые вы можете использовать, например, сохранить список запусков данных, а затем сделать sum().