2015-10-26 2 views
2

Я новичок как для Python, так и для NetworkX. У меня есть квадрат, регулярный граф G с NxN узлами (a решетка). Такие узлы помечены с помощью dict (см. Код ниже). Теперь я хочу, чтобы edgelist возвращал начало и конечной точке каждого ребра, не ссылаясь на координаты узла, а на метку, указанную узлом.Замена значений `edgelist` на словаря` labels`

Пример:

N = 3 
G=nx.grid_2d_graph(N,N) 
labels = dict(((i, j), i + (N-1-j) * N) for i, j in G.nodes()) 
#This gives nodes an attribute ID that is identical to their labels 
for (i,j) in labels: 
    G.node[(i,j)] ['ID']= labels[(i,j)] 
edgelist=G.edges() #This gives the list of all edges in the format (Start XY, End XY) 

Если я запускаю его с N=3 я получаю:

In [14]: labels 
Out[14]: {(0, 0): 6, (0, 1): 3, (0, 2): 0, (1, 0): 7, (1, 1): 4, (1, 2): 1, (2, 0): 8, (2, 1): 5, (2, 2): 2} 

Эта схема этикетки верхний левый узел как 0, с узлом (N-1)th помещаются в нижнем правом углу. И это то, чего я хочу. Теперь проблема с edgelist:

In [15]: edgelist 
Out [15]: [((0, 1), (0, 0)), ((0, 1), (1, 1)), ((0, 1), (0, 2)), ((1, 2), (1, 1)), ((1, 2), (0, 2)), ((1, 2), (2, 2)), ((0, 0), (1, 0)), ((2, 1), (2, 0)), ((2, 1), (1, 1)), ((2, 1), (2, 2)), ((1, 1), (1, 0)), ((2, 0), (1, 0))] 

Я пытался решить проблему с этими линиями (вдохновение отсюда: Replace items in a list using a dictionary):

allKeys = {} 
for subdict in (labels): 
    allKeys.update(subdict) 

new_edgelist = [allKeys[edge] for edge in edgelist] 

, но я получаю эту замечательную вещь, которая просвещает мой понедельник:

TypeError: cannot convert dictionary update sequence element #0 to a sequence 

Подводя итог, я хочу иметь возможность заменить элементы edgelist список со значениями словаря labels, так что, скажем, край от ((2,0),(1,0)) (который соответствует узлам и) возвращается (8,7). Бесконечное спасибо!

ответ

1

Я считаю, что вы ищете просто nx.relabel_nodes(G,labels,False) вот documentation

Here is the output when I printed the nodes of G before and after calling the relabel nodes function.

# Before relabel_nodes 
[(0, 1), (1, 0), (0, 0), (1, 1)] 
# After relabel_nodes 
[0, 1, 2, 3] 

After doing this, the edge labels automatically becomes what you expect.

# Edges before relabelling nodes 
[((0, 1), (0, 0)), ((0, 1), (1, 1)), ((1, 0), (0, 0)), ((1, 0), (1, 1))] 
# Edges after relabelling nodes 
[(0, 1), (0, 2), (1, 3), (2, 3)] 

Кроме того, я ответил на этот вопрос в чате, который вы создали, но кажется, вас не уведомили.

+1

спасибо. У меня действительно было много проблем с чатом, так что да, меня не уведомили. Прошу прощения за то, что я не читал об этом раньше. :) – FaCoffee

+0

Btw, документация не очень полезна и описательна. Если 'G' - мой график, а' метки '- это те, которые были заданы в другом вопросе, как я могу быть уверен, что никаких переходов/ошибок/ошибок не будет? Думаю, это из-за того, как определяется «ярлыки», правильно? – FaCoffee

+1

Я не совсем уверен, что понял ваш вопрос. Но да, определение меток важно для безупречных результатов. –

Смежные вопросы