Как сохранить каждую строку np.matrix в массив из 9 пар? - PullRequest
0 голосов
/ 30 мая 2018

Что ж, я пытаюсь создать matplotlib анимацию для графика, используя networkx, но я застрял при попытке прочитать матрицу, которая содержит последовательность узлов, представляющую путь, по которому нужно следовать, и наконец каждой строки имеет общий вес этого пути.Так что это выглядит примерно так:

[node1, node2, node3, ..., node9, weight1   ]
[node1, node3, node2, ..., node9, weight2   ](the nodes 1 to 9 are permuted and 
.                             .     .          then drawed in pairs)
.                             .     .
.                             .     .
[node9, node8, node4, ..., node1, weight(9!)]

Я очень плохо знаком с Python и привык работать в C, поэтому то, что я пытаюсь сделать, больше похоже на:

  1. Проверьте первую строку в матрице, прочитайте узлы и сохраните ее в массив кортежей:

    nPath=[(node1,node2),(node2,node3),(node3,node4),...,(node8,node9),(node9,node1)]

  2. Используйте весэту строку и проверьте, является ли она самой короткой.

  3. Покажите путь на графике, затем вернитесь и попробуйте теперь со строкой 2.
  4. Повторите.

Это мой код:

import networkx as nx
import numpy as np
import matplotlib.pyplot as plt
import itertools as it
import matplotlib.animation as animation

#Contains the combinations of each pair of nodes and their weight.
with open("pair_weight.txt","r") as file:
    W_edges = np.loadtxt(file, dtype=int, delimiter='   ')

G = nx.Graph()
G.add_weighted_edges_from(W_edges)

fig, ax = plt.subplots(figsize=(6,4))

#Contains the total waight of each path 1 to 9.
with open("Path_Weights.txt","r") as file:
    W_paths = np.loadtxt(file, dtype=int)

#contains all 9! permutations of the nodes
with open("Permutations.txt","r") as file:
    nPath = np.loadtxt(file, dtype=int, delimiter=' ')

nPaths = np.c_[nPath, W_paths]

pos = nx.kamada_kawai_layout(G)

labels = {}    
for node in G.nodes():
    if node in pos: 
        labels[node] = node

npaths = []

def update_path(num):
    for i in range(0,8):
        if i==8:          #This is were i'm trying to do it like in c.
            npaths.append[(nPaths.item((num, i))),(nPaths.item((num,0)))]
    npaths.append[(nPaths.item((num, i))),(nPaths.item((num,i+1)))]
    nx.draw_networkx_edges(G, pos, width=2, edgelist=npaths, edge_color='r')


    nx.draw_networkx_nodes(G, pos, node_size=900, node_color='skyblue', node_shape='o', alpha=0.7, edgecolor='deepskyblue') 
    nx.draw_networkx_labels(G, pos, labels, font_size=14, font_color='k', alpha=5)
    nx.draw_networkx_edges(G, pos, edge_color='gray')

ani = animation.FuncAnimation(fig, update_path, frames=6, interval=1000, repeat=True)
plt.show()

1 Ответ

0 голосов
/ 30 мая 2018

Если nPath (без s) - это ваша матрица с путями узлов, скажем, с формой (P, N) (P путей из N узлов), вы можете создать массив, скажем nPathEdgesс формой (P, N, 2), где nPathEdges[i, j] содержит j -й край (представленный как [node1, node2]) i -ого пути, например:

nPathEdges = np.stack([nPath, np.roll(nPath, -1, axis=1)], axis=2)

Затем вы можете выполнить итерациюэта матрица и веса, как:

w_min = np.inf
for edges, w in zip(nPathEdges, W_paths):
    # You can have it as a list of tuples like this,
    # although as far as I can tell NetworkX should work fine with a NumPy array too
    edges = [tuple(e) for e in edges]
    nx.draw_networkx_edges(G, pos, width=2, edgelist=npaths, edge_color='r')
    if w < w_min:
        w_min = w
        # Do something for minimum weight...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...