Python NetworkX: как получить доступ к ребрам с определенным значением данных - PullRequest
0 голосов
/ 27 августа 2018

Для модели перколяции облигаций я хочу построить квадратную решетку с помощью NetworkX, используя grid_2d_graph(l,l). Это дает мне квадратную решетку размером lxl с каждым ребром open.

Идея состоит в том, что я хочу выбрать край графика случайным образом, а затем проверить, назначен ли край уже (1, чтобы оставить край таким, какой он есть, 0, чтобы добавить его в список ребер, чтобы удалить из график), и если он еще не был назначен (ребро имеет 'state' = -1), я хочу выбрать случайным образом с определенной вероятностью p, если ребро открыто (оставьте его как есть), или если оно закрыто (поместите это в список краев, чтобы удалить).

Поэтому я сохранил все ребра с атрибутом данных 'state' = -1 в виде списка, а затем попытался случайным образом получить доступ к записи этого списка, чтобы затем изменить атрибут 'state' на какое-то значение. Но похоже, что эта операция не разрешена. Когда я пытаюсь редактировать состояния, я получаю следующую ошибку:

File "bond-percolation.py", line 39, in <module>
    ed[10][2] = 1
TypeError: 'tuple' object does not support item assignment

Итак, мой вопрос: как я могу случайно выбрать ребро и эффективно изменить значение 'state'?

Вот мой код:

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt
import random

#Width of the quadratic lattice
l = 30
#Create grid
G = nx.grid_2d_graph(l,l)
#Total number of edges in the lattice
n = 2 * l * (l-1)
m = 0
#Set probability if an edge is open
p = 0.17
#Create empty list to add closed edges later
ed = []
ld = []

for e in G.edges(data = 'state', default = -1):
    ed.append(e)

#Creating the lattice
while (m != n):
    i = np.random.randint(n-1)
    a = random.random()
    if (ed[i][2] == -1):
        if (a > p):
            ld.append(ed[i])
        else:
            ed[i][2] = 1    
        m = m + 1


#We need this so that the lattice is drawn vertically to the horizon
pos = dict( (l,l) for l in G.nodes() )

#Draw the lattice
nx.draw_networkx(G, pos = pos, with_labels = False, node_size = 0)

#Plot it on the screen
plt.axis('off')
plt.show()

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Перечитывая вашу ошибку, я не думаю, что ваша ошибка связана со случайным выбором краев. Вместо этого вы неправильно пытаетесь присвоить значения состояния.

ed[10][2] возвращает все ребро (предположительно, dict). Было бы полезно включить вывод, когда вы просто запускаете ed[10][2].

Вы не можете присвоить int этому. Вы, вероятно, хотите сделать ed[10][2]['state'] = 1

0 голосов
/ 27 августа 2018

Полагаю, вы можете просто найти его с помощью селектора фронта .

Нет встроенного селектора (afaik), но вы можете создать вспомогательную функцию, которая перебирает края и возвращает ваш список.

def filter_edges(value):
   edge_list = []
   for u,v,s in G.edges(data='state'):
      if s == value:
          edge_list.append((u,v))

   return edge_list
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...