Topic: estrazione grado di un singolo nodo  (Letto 395 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline SmallDev

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
estrazione grado di un singolo nodo
« il: Marzo 31, 2018, 12:54 »
Ciao a tutti,
avrei un piccolo problemino che forse qualcuno più esperto di me in Python sa risolvere.
Devo lavorare su un grafo fornitomi di cui non conosco nulla.
Sono riuscito a contare il numero di nodi e di archi, fino a qui tutto abbastanza tranquillo.
Il problema mi sorge nel momento in cui devo estrarre il grado di ogni singolo nodo.
Ho visto che la funzione
G.degree(G.nodes())
(G è il nome del mio grafo)
mi ritorna il riferimento al nodo ('n0','n1','n2'...) e il grado del nodo stesso e lo fa per tutti i nodi.
Io vorrei estrarre il grado di ogni singolo nodo, quindi avevo intenzione di ciclare con un indice i tutto il grafo ed estrarre singolarmente i gradi.
Una cosa del tipo (tralascio il ciclo)
G.degree
o
G.degree()
o
G.degree(i)
Il problema è che mi dà errore, mi dice che l'indice i non esiste.
Errore identico se al posto di i metto un numero intero
G.degree([0])
o
G.degree[0]
o
G.degree(0)
Mi dà l'errore:
KeyError: 0
Però se scrivo proprio il nodo
G.degree('n0')
o
G.degree('n1')
mi ritorna correttamente il grado.

Quindi mi chiedo se esista un modo per estrarre il grado di ogni singolo nodo facendo un ciclo o una cosa del genere, oppure come posso fare riferimento ad un singolo nodo utilizzando un indice.
Sulla documentazione non ho trovato niente di diverso da ciò che ho provato io ma che mi dà errore, spero che qualcuno mi possa aiutare.
Utilizzo l'ultima versione di networkX, la 2.1.

Grazie a chi mi risponderà dandomi qualche idea
Intanto auguro Buona Pasqua a tutti

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:estrazione grado di un singolo nodo
« Risposta #1 il: Aprile 02, 2018, 12:58 »
Davvero non capisco... fai una chiamata di libreria, quella giusta e fine della fiera. Non c'e' magia.

Offline SmallDev

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:estrazione grado di un singolo nodo
« Risposta #2 il: Aprile 02, 2018, 18:35 »
Se avessi saputo qual è la chiamata giusta da fare non avrei posto la domanda, ti pare?
Sono due giorni buoni che ci sto smanettando, vorrei una risposta, non critiche, se mi si può aiutare bene altrimenti niente commenti da saccenti grazie.
È facile fare per chi conosce le cose, per chi è ignorante in materia (come me) e quindi chiede le cose sui forum è un po' più difficile, altrimenti non porrebbe domande, dopo aver letto docuemntazione su documentazione e non aver trovato risposta.
Se mi puoi rispondere esplicitamente ti ringrazio, altrimenti puoi fare a meno di rispondere, nessuno ti obbliga.
Buona giornata

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:estrazione grado di un singolo nodo
« Risposta #3 il: Aprile 03, 2018, 00:04 »
Se avessi saputo qual è la chiamata giusta da fare non avrei posto la domanda, ti pare?
Sono due giorni buoni che ci sto smanettando, vorrei una risposta, non critiche, se mi si può aiutare bene altrimenti niente commenti da saccenti grazie.
È facile fare per chi conosce le cose, per chi è ignorante in materia (come me) e quindi chiede le cose sui forum è un po' più difficile, altrimenti non porrebbe domande, dopo aver letto docuemntazione su documentazione e non aver trovato risposta.
Se mi puoi rispondere esplicitamente ti ringrazio, altrimenti puoi fare a meno di rispondere, nessuno ti obbliga.
Buona giornata

1. Sull'internet i permalosetti non hanno vita troppo facile
2. Proprio non hai capito: il problema e' il tuo metodo. Invece di leggere la documentazione di degree() hai provato ad usare tutte le sintassi che ti sono venute in mente. Ora se applichi questo metodo non riuscirai mai a fare nulla di non banale senza comunque uno sforzo immane.

Leggendo la documentazione (https://networkx.github.io/documentation/networkx-1.10/reference/generated/networkx.DiGraph.degree.html) ti avrebbe detto per filo e per segno come usarla. In particolare, dice --> default=all nodes.

Per il resto la tua domanda originale e' sgangherata. Vuoi estrarre il grado di *ogni singolo nodo*. Quindi vuoi il grado di *ciascun* nodo. Che vuole dire che sia chiamare G.degree() sia (inutile, piu' complicato... G.degree(G.nodes())).
Per quale motivo vuoi invece tirarli fuori *ad uno ad uno*, se li vuoi tutti?

Offline SmallDev

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:estrazione grado di un singolo nodo
« Risposta #4 il: Aprile 03, 2018, 05:50 »
1. Non sono permaloso non ti preoccupare, semplicemente a domanda voglio la risposta diretta, se me la si vuole dare, visto che nessuno è obbligato a fare niente.
2. Tutto quello che mi hai suggerito l'ho già provato (ovviamente, altrimenti non starei qui a chiedere), però se proprio insisti ti pongo il problema originale.
Devo trovare il nodo di grado maggiore e per farlo ho pensato di confrontare singolarmente grado per grado e aggiornare il max man mano che, scorrendo, ne trovo uno più grande.
Tutto qui

Offline riko

  • python deus
  • *
  • moderatore
  • Post: 7.453
  • Punti reputazione: 12
    • Mostra profilo
    • RiK0 Tech Temple
Re:estrazione grado di un singolo nodo
« Risposta #5 il: Aprile 04, 2018, 00:30 »
1. Non sono permaloso non ti preoccupare, semplicemente a domanda voglio la risposta diretta, se me la si vuole dare, visto che nessuno è obbligato a fare niente.
2. Tutto quello che mi hai suggerito l'ho già provato (ovviamente, altrimenti non starei qui a chiedere), però se proprio insisti ti pongo il problema originale.
Devo trovare il nodo di grado maggiore e per farlo ho pensato di confrontare singolarmente grado per grado e aggiornare il max man mano che, scorrendo, ne trovo uno più grande.
Tutto qui

1. sei permaloso, rileggi la tua risposta precedente. e questo e' un forum, non un supporto a pagamento. quindi trovi l'assistenza che trovi, con tutti i quirk del caso.
2. hai provato anche di piu' (anche cose senza senso), ma non ragioni in modo algoritmico.

G.degree() cosa ti ritorna? Un dictview che quando lo iteri ti da coppie (nodo, grado). Bene. Quindi hai solo bisogno di scrivere una funzione che data una sequenza di coppie node valore ti dia il nodo con valore massimo (nota che parlo di *valore*, non di grado qui).
Che fa quasi esattamente quello che hai descritto (o meglio, tu hai descritto un'implementazione possibile... )

Eccola qua:


def max_node(nbunch, key=lambda e: e[1]):
    """
    Return the index of the item in the bunch which maximizes key.
    """
    return max(nbunch, key=key)[0]


Ora... la cosa che non e' immediatamente chiara e' quanto sia generica, potente e riusabile questa funzione.

Per esempio... vuoi sapere quale e' il nodo con la massima betweenness?

Ma eccotelo qua:

max_node(nx.betweenness_centrality(G).iteritems())

Gia'... un dizionario puoi iterarlo come lista di coppie... proprio come quelle che funzionano con max_node.

E... presente quella funzione comoda comoda che piace tanto agli utenti matlab (argmax) che numpy ti da ma non esiste in Python core?

Ma guarda che bella, implementata e chiamata...

In [39]: def argmax(seq):
   ....:     return max_node(enumerate(seq))
   ....:

In [40]: argmax([1, 7, 4, 9, 2, -1])
Out[40]: 3


Insomma... uno strumento piuttosto generico. Talmente generico che e' un peccato chiamarla max_node. Meglio pairs_max? argmax_pair? boh... comunque bella potente.

Ovviamente ancora piu' potente e' capire come funziona il trucco che ho usato. E scoprire che esistono sort e sorted, e reverse e le list comprehensions e tante altre cose.