[Python] Ordinare un array

Messaggioda mic_1 » 20/08/2019, 00:07

Ciao a tutti,
Ho un array di questo tipo con numpy:

Codice:
{'ABL1': 0.4979310344827586, 'BRCA1': 0.989041095890411, 'ABRAXAS1': 0.5588235294117647, 'ATM': 0.6735074626865671, 'BABAM1': 0.5588235294117647, 'BABAM2': 0.5605590062111802, 'BARD1': 0.6446428571428572, 'BRCC3': 0.5605590062111802, 'CHEK2': 0.5412293853073463, 'H2AFX': 0.5667189952904239, 'H2BFS': 0.5486322188449848, 'HERC2': 0.546142208774584, 'HIST1H2AA': 0.502086230876217, 'HIST1H2AB': 0.502086230876217, 'HIST1H2AC': 0.502086230876217, 'HIST1H2AD': 0.502086230876217, 'HIST1H2AE': 0.502086230876217, 'HIST1H2AG': 0.502086230876217, 'HIST1H2AH': 0.502086230876217, 'HIST1H2AI': 0.502086230876217, 'HIST1H2AJ': 0.502086230876217, 'HIST1H2AK': 0.502086230876217, 'HIST1H2AL': 0.502086230876217, 'HIST1H2AM': 0.502086230876217, 'HIST1H2BA': 0.5486322188449848, 'TNKS': 0.4979310344827586, 'TRIB3': 0.4979310344827586, 'TRIML2': 0.4979310344827586, 'TRRAP': 0.5034867503486751, 'VCP': 0.4979310344827586, 'XRCC4': 0.4979310344827586, 'ZNF350': 0.4986187845303867, 'ZNF613': 0.4979310344827586, 'CCNE1': 0.49930843706777317, 'CDK1': 0.4979310344827586, 'CSNK2A1': 0.4979310344827586, 'E2F4': 0.5, 'RBL1': 0.49930843706777317, 'RBL2': 0.49930843706777317, 'PTGDR': 0.4986187845303867, 'EGF': 0.4979310344827586, 'EME1': 0.5194244604316547, 'MUS81': 0.5201729106628242, 'SLX1A': 0.5194244604316547, 'SLX1B': 0.5194244604316547, 'SLX4': 0.5201729106628242, 'EME2': 0.5194244604316547, 'ERCC1': 0.5239477503628447, 'ERCC4': 0.5239477503628447, 'ESR2': 0.4979310344827586, 'FOXA1': 0.4979310344827586, 'FRK': 0.4979310344827586, 'GEN1': 0.5164520743919886, 'GNAQ': 0.4979310344827586, 'NR1H4': 0.4979310344827586, 'PIAS1': 0.5013888888888889, 'PLK1': 0.4979310344827586, 'RNF4': 0.5420420420420421, 'RRM2': 0.362086258776329, 'RTEL1': 0.5164520743919886, 'RXRA': 0.4979310344827586, 'SP1': 0.4979310344827586, 'STAT1': 0.4979310344827586, 'SUMO3': 0.3525390625, 'TEX15': 0.5308823529411765}

Vorrei ordinarlo in base al 1° elemento per poi stampare solo il 2° elemento, quello numerico.
Se servisse ho già trovato l'indice dell'ordinamento che vorrei ottenere ma purtroppo non riesco ad usarlo.
Ho provato ad usarlo nella
Codice:
sorted(x , key=indice)
ma nulla.
Ho provato ad usarle entrambe
Codice:
sorted() , sort()
ma non riesco a riodinare o meglio devo prima ordinare tutto e poi renderlo array, ma perdo il valore numerico che mi serve.
Come mi consigliate procedere?
Ho provato ad usare
Codice:
numpy.ndarray.sort(x)
della variabile (che mi restituisce quanto sopra riportato) ma non mi da nulla. Ho provato anche ha ordinare prima, a prendere il valore con
Codice:
values()
e poi rendere il risultato un array ma nulla. Non riesco a risalire al valore numerico.

Posso prendere subito il valore
Codice:
x.values()
ma poi provando ad ordinarlo in questo modo
Codice:
sorted(x , key=indice)
non mi restituisce nulla.
Come devo procedere?

Grazie!
mic_1
Junior Member
Junior Member
 
Messaggio: 142 di 386
Iscritto il: 11/01/2011, 18:11

Re: [Python] Ordinare un array

Messaggioda caulacau » 20/08/2019, 00:12

Quello sembra un dizionario, mica un array.
Avatar utente
caulacau
Junior Member
Junior Member
 
Messaggio: 225 di 466
Iscritto il: 08/05/2019, 18:30

Re: [Python] Ordinare un array

Messaggioda mic_1 » 21/08/2019, 16:49

Si effettivamente anche senza np.asarray() ho visualizzati i dati tra graffe {} come un dict_value

Io avrei cmq bisogno, partendo dallo status iniziale che è il medesimo, di ordinarli in base al nome 'nome : valore', prendere il valore e inserirlo in una array per poi stamparlo in un ciclo for elemento per elemento tutti incolonnati.

Come fare? inserirli in array con numpy mi han detto essere più rapido in elaborazione rispetto a 'list'

Io avevo inizialmente avevo realizzato una funzione che mi tornava
Codice:
 list(nx.closeness_centrality(G).values())
e nel ciclo di stampa su interfaccia grafica gli passavo come parametro
Codice:
 sorted(G.nodes())
(nodi ordinati).
Ho però notato che i valori non vengono presi in automatico in base all'ordine dei nodi perchè nel calcolo il closeness centrality non vuole i nodi per cui li passavo solo come parametro della funzione in questo modo:
Codice:
def Closeness_centrality(u):
    return list(nx.closeness_centrality(G, u = None).values()) # u sono i nodi

ed in stampa:

node = sorted(G.nodes())
for i in range(0, G.number_of_nodes()):
     print(Closeness_centrality(node)[i])



Ho inserito il PRINT per semplificare ora la stampa ma in realtà uso l'istruzione apposita per scrivere su wx.Frame

Il mio problema sta nel fatto che:
1) IMPIEGA 20-30 MIN A SCRIVERE
2) HO NOTATO CHE NON VIENE AUTOMATICAMENTE ORDINATO (il closeness non vuole node come parametro a differenza di clustering coeff che vuole (G, node) quindi procedendo analogamente viene automaticam riordinato il valore in base all'ordine dei nodi scritti nella prima colonna.
PS: HO ORDINATO I NODI SCRITTI SULLA PRIMA COLONNA DELLA TABELLA IN WX.FRAME E VORREI RIPORTARE GLI ALTRI VALORI (PER CIASCUN NODO) NEL MEDESIMO ORDINE.
SO CHE NUMPY è MOLTO PIù RAPIDO NELLA ELABORAZIONE DI CALCOLO.
3) Se non uso Numpy e li ordino con sorted() o sort() poi non ho cmq modo di usare .values()
NON RIESCO A RISALIRE AL VALORE.

Grazie
mic_1
Junior Member
Junior Member
 
Messaggio: 143 di 386
Iscritto il: 11/01/2011, 18:11

Re: [Python] Ordinare un array

Messaggioda mic_1 » 21/08/2019, 23:20

CREDO DI AVER RISOLTO..

Vi spiego...
Le funzioni le ho scritte così:
Codice:
def Closeness_Centrality():
     return np.array(sorted(nx.closeness_centrality(G2).items(), key=itemgetter(0)))

Ho preso .item() anzichè .values()
Nel ciclo for
Codice:
for i in range(0, numero di nodi):
     print(Closeness_Centrality()[i][1])
     print()
     .....

key=itemgetter(0) -> li ordina in base alla key
key=itemgetter(1) -> li ordina in base al valore

Cosa ne pensate? Ottengo sicuramente quanto cercavo.

L'Unico "inconveniente" è che impiega del tempo a ciclare perchè ho 6 colonne = 6 print() e il ciclo scrive riga per riga per il numero dei nodi.

Per caso avete qualche consiglio utile su come velocizzare????? o magari cambiare il ciclo for con altro....

Ora faccio ulteriori test sul tempo di elaborazione con
Codice:
 import time: start, end, end-start
mic_1
Junior Member
Junior Member
 
Messaggio: 144 di 386
Iscritto il: 11/01/2011, 18:11


Torna a Informatica

Chi c’è in linea

Visitano il forum: utente__medio e 1 ospite