[Python] domande array numpy
Ciao a tutti... Piccoli problemi con gli array numpy. Domanda 1: come faccio a sapere l'indice di un elemento X? es. a=np.array([1,2,3,4,3,2,1]) come faccio a sapere le posizioni in cui c'è l'elemento '2' ovvero 1 e 5? Domanda 2: come faccio a sapere il numero di occorrenze di X in un array? (per le liste c'è count) es. a=np.array([1,2,3,4,3,2,1]) (tipo a.count(2) - 2 a.conut(4) -1) grazie a tutti. Ciao Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] domande array numpy
Ciao Matteo, - Original Message - Ciao a tutti... Piccoli problemi con gli array numpy. Domanda 1: come faccio a sapere l'indice di un elemento X? es. a=np.array([1,2,3,4,3,2,1]) come faccio a sapere le posizioni in cui c'è l'elemento '2' ovvero 1 e 5? la prima che mi viene in mente è: positions, = where(a==2) Domanda 2: come faccio a sapere il numero di occorrenze di X in un array? (per le liste c'è count) es. a=np.array([1,2,3,4,3,2,1]) (tipo a.count(2) - 2 a.conut(4) -1) len(positions) grazie a tutti. Ciao Matteo Ciao gianfranco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] domande array numpy
Il 17/11/2011 12:36, Gianfranco Durin ha scritto: Domanda 2: come faccio a sapere il numero di occorrenze di X in un array? (per le liste c'è count) es. a=np.array([1,2,3,4,3,2,1]) (tipo a.count(2) - 2 a.conut(4) -1) len(positions) Questa però è meglio: sum(a==X) Grazie mille! Ciao Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] androWget
A chiunque possa interessare ho rilasciato un piccolo script per scaricare risorse online su android. Ovviamente utilizzando android-sl4a. Si accettano suggerimenti. Ecco il link http://sourceforge.net/projects/androwget ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] Utilizzo completo della cpu
Ciao lista, Vorrei sapere se è possibile utilizzare tutti i core della cpu per eseguire calcoli gravosi. Ho guardato un po' in internet e come risposta ho trovato il multithreading che ho già utilizzato un paio di volte. Però non riesco a capire se è possibile applicarlo anche ad un unico comando. Mi spiego meglio. ho una funzione fp non lineare che deve essere ottimizzata... fp = lambda v, x,y, phi:(1+v[0]*phi+v[1]*x+v[2]*x*phi+v[3]*y+v[4]*y*phi+v[5]*x**2... +v[6]*phi*x**2+v[7]*y**2+v[8]*phi*y**2+v[9]*x*y+v[10]*phi*x*y)/(v[11]+v[12]*phi... +v[13]*x+v[14]*x*phi+v[15]*y+v[16]*y*phi+v[17]*x**2+v[18]*phi*x**2+v[19]*y**2... +v[20]*phi*y**2+v[21]*x*y+v[22]*phi*x*y) imposto la funzione obiettivo e = lambda v, x,y, phi, z: (fp(v,x,y,phi)-z) e infine avvio il processo di ottimizzazzione ai minimi quadrati v, success = leastsq(e, v0, args=(x,y,phi,z), maxfev=1) Questo va avanti per minuti e usa un solo core. C'è un modo per suddividere i calcoli di leastsq tra più core? (spero di si) Grazie a tutti dell'aiuto sempre pronto Ciao Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
- Original Message - Ciao lista, Vorrei sapere se è possibile utilizzare tutti i core della cpu per eseguire calcoli gravosi. Ho guardato un po' in internet e come risposta ho trovato il multithreading che ho già utilizzato un paio di volte. Però non riesco a capire se è possibile applicarlo anche ad un unico comando. Mi spiego meglio. ho una funzione fp non lineare che deve essere ottimizzata... fp = lambda v, x,y, phi:(1+v[0]*phi+v[1]*x+v[2]*x*phi+v[3]*y+v[4]*y*phi+v[5]*x**2... +v[6]*phi*x**2+v[7]*y**2+v[8]*phi*y**2+v[9]*x*y+v[10]*phi*x*y)/(v[11]+v[12]*phi... +v[13]*x+v[14]*x*phi+v[15]*y+v[16]*y*phi+v[17]*x**2+v[18]*phi*x**2+v[19]*y**2... +v[20]*phi*y**2+v[21]*x*y+v[22]*phi*x*y) imposto la funzione obiettivo e = lambda v, x,y, phi, z: (fp(v,x,y,phi)-z) e infine avvio il processo di ottimizzazzione ai minimi quadrati v, success = leastsq(e, v0, args=(x,y,phi,z), maxfev=1) Questo va avanti per minuti e usa un solo core. C'è un modo per suddividere i calcoli di leastsq tra più core? (spero di si) Grazie a tutti dell'aiuto sempre pronto Ciao Matteo Matteo, oggi ti tempesto... Io non so nulla di calcolo su più core, ma faccio molto i minimi quadrati. Se ti interessa sto sviluppando un sistema semplice per fare tutto da riga di comando, lo trovi qui: https://github.com/gdurin/pyFitting la cosa che ti potrebbe aiutare potrebbe essere utilizzare le derivate analitiche (il mio parametro -d), che diminuiscono sensibilmente il numero di passi da far fare alla routine. Oppure prendi spunto per farlo tu (ho usato sympy e numexpr per compilare e ottimizzare il calcolo) Per ogni dettaglio puoi vedere qui in un talk che ho fatto di recente: http://emma.inrim.it:8080/gdurin/talks/fit-the-elefant-on-the-use-of-least-square-methods-from-simple-cases-to-multiparameter-scaling-functions/ Certo, fittare con 22 parametri è un bel problema, ed è proprio fittare un elefante (che pare abbia bisogno di 'soli' 13 parametri). Un problema noto è che spesso molti sistemi (le funzioni teoriche) sono 'sloppy', cioé poco sensibili alle variazioni anche ampie dei parametri. Quindi il fit non si muove mai, soprattutto se hai le derivate (per il calcolo dello jacobiano) numeriche. Inoltre di solito è un casino decidere i valori iniziali, soprattutto nel tuo caso (so che qualcuno usa degli algoritmi genetici per la stima dei valori iniziali, ma non ne so molto). Cose biologiche? ciao Gianfranco ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Il 17/11/2011 17:19, Matteo Perini ha scritto: Ciao lista, Vorrei sapere se è possibile utilizzare tutti i core della cpu per eseguire calcoli gravosi. Si. Come è possibile usare anche tutte le cpu dei computer in una rete. Il come è un altro discorso... Ho guardato un po' in internet e come risposta ho trovato il multithreading che ho già utilizzato un paio di volte. Il multithreading in Python non va bene, a meno di condizioni particolari (cerca su Internet Python GIL). Però non riesco a capire se è possibile applicarlo anche ad un unico comando. Che intendi come comando? Mi spiego meglio. ho una funzione fp non lineare che deve essere ottimizzata... fp = lambda v, x,y, phi:(1+v[0]*phi+v[1]*x+v[2]*x*phi+v[3]*y+v[4]*y*phi+v[5]*x**2... +v[6]*phi*x**2+v[7]*y**2+v[8]*phi*y**2+v[9]*x*y+v[10]*phi*x*y)/(v[11]+v[12]*phi... +v[13]*x+v[14]*x*phi+v[15]*y+v[16]*y*phi+v[17]*x**2+v[18]*phi*x**2+v[19]*y**2... +v[20]*phi*y**2+v[21]*x*y+v[22]*phi*x*y) Scusa, ma perchè usi lambda? Nel tuo caso rende il codice meno leggibile. Fai un più semplice: def fp(v, x, y, phi): ... Le lambda dovrebbero essere usate *solo* se ti serve una funzione anonima (ad esempio per passarla come argomento ad un altra funzione). imposto la funzione obiettivo e = lambda v, x,y, phi, z: (fp(v,x,y,phi)-z) e infine avvio il processo di ottimizzazzione ai minimi quadrati v, success = leastsq(e, v0, args=(x,y,phi,z), maxfev=1) Questo va avanti per minuti e usa un solo core. C'è un modo per suddividere i calcoli di leastsq tra più core? (spero di si) Devi parallelizzare l'algoritmo, e di solito non è banale. In letteratura dovresti trovare algoritmi per l'ottimizzazione ai minimi quadrati paralleli, magari trovi anche implementazioni già pronte. Una volta che hai l'algoritmo, l'altro problema è l'implementazione (anche questo non banalissimo). Ciao Manlio -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk7FR/UACgkQscQJ24LbaUQWyQCaAwJJ3RG49Tavy19BBSRDvXl3 9P0An1g1oS7rfLK4quLwRXUvsFqbXfEz =UcKu -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
2011/11/17 Matteo Perini perini.mat...@gmail.com: Ciao lista, ciao Matteo, Vorrei sapere se è possibile utilizzare tutti i core della cpu per eseguire calcoli gravosi. Per usare tutti i core devi usare il modulo multiprocessing (incluso nella libreria dalla 2.7), l'API è simile a quella del modulo threading. ciao -- Gian Mario Tagliaretti GNOME Foundation member gia...@gnome.org ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
On Thu, 17 Nov 2011 17:19:12 +0100, Matteo Perini perini.mat...@gmail.com wrote: Ciao lista, Vorrei sapere se è possibile utilizzare tutti i core della cpu per eseguire calcoli gravosi. Ho guardato un po' in internet e come risposta ho trovato il multithreading che ho già utilizzato un paio di volte. Però non riesco a capire se è possibile applicarlo anche ad un unico comando. Non credo nel tuo caso. Il codice python in linea di massima non può essere eseguito in multithread, nel senso che l'interprete può esegure un solo opcode alla volta. Ma se questo opcode è lungo di suo, per esempio legge da un file, o dalla rete, o fa qualcosa di complesso ma restando in C, senza toccare pezzi di python, allora può rilasciare il GIL e permettere ad altri thread di correre in parallelo. Di conseguenza, un programma python può beneficiare di multithread solo quando è IO-bound, non quando è CPU-bound, e il tempo di CPU è speso in codice Python. Nota che - se ricordo bene - numpy rilascia il GIL per le operazioni implementate in C, ovvero, se fai A + B dove A e B sono matrici 1 x 1, mentre le somma può permettere ad altro codice (python o meno) di correre. Ma la funzione leastsq, anche se è scritta in C, valuta continuamente la fp che, essendo scritta in Python, ha bisogno di aspettare il GIL per essere eseguita. Al di là della prestazione di Python coi thread, non credo che la leastsq sia parallelizzabile: se non dico cappellate, l'algoritmo consiste in valutare continuamente la funzione in un numero di punti e ogni valutazione ha bisogno dei risultati precedenti, quindi non mi sembra un problema adatto ad essere parallelizzato. -- Daniele Varrazzo - Develer S.r.l. http://www.develer.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Il 17/11/2011 17:19, Matteo Perini ha scritto: Ciao lista, Vorrei sapere se è possibile utilizzare tutti i core della cpu per eseguire calcoli gravosi. Ho guardato un po' in internet e come risposta ho trovato il multithreading che ho già utilizzato un paio di volte. Però non riesco a capire se è possibile applicarlo anche ad un unico comando. Mi spiego meglio. ho una funzione fp non lineare che deve essere ottimizzata... fp = lambda v, x,y, phi:(1+v[0]*phi+v[1]*x+v[2]*x*phi+v[3]*y+v[4]*y*phi+v[5]*x**2... +v[6]*phi*x**2+v[7]*y**2+v[8]*phi*y**2+v[9]*x*y+v[10]*phi*x*y)/(v[11]+v[12]*phi... +v[13]*x+v[14]*x*phi+v[15]*y+v[16]*y*phi+v[17]*x**2+v[18]*phi*x**2+v[19]*y**2... +v[20]*phi*y**2+v[21]*x*y+v[22]*phi*x*y) Prima che ti complichi la vita con una implementazione parallela, ti consiglio di ottimizzare l'implementazione attuale. In particolare, nella definizione di fp vedo *molti* termini che sono calcolati ripetutamente, mentre possono essere pre-calcolati una sola volta. Magari un compilatore C efficiente è in grado di ottimizzare i termini comuni, ma non CPython. [...] Ciao Manlio -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk7FS7MACgkQscQJ24LbaUSqegCfUDt74UmB2tFwF4enDtJdXP30 jxYAmwRygA9IePrjxI6r+GwiaXDT7B/n =mTtp -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Il 17/11/2011 18:50, Daniele Varrazzo ha scritto: On Thu, 17 Nov 2011 17:19:12 +0100, Matteo Perini [...] Al di là della prestazione di Python coi thread, non credo che la leastsq sia parallelizzabile: se non dico cappellate, l'algoritmo consiste in valutare continuamente la funzione in un numero di punti e ogni valutazione ha bisogno dei risultati precedenti, quindi non mi sembra un problema adatto ad essere parallelizzato. Se la funzione è semplice, si può ottimizzare il tutto. Ad esempio: http://it.wikipedia.org/wiki/Metodo_dei_minimi_quadrati nel caso in cui la funzione obbiettivo sia una retta. In questo caso la parallelizzazione è banale. Anche il caso di funzione lineare dovrebbe essere possibile da parallelizzare (per curiosità ho cercato ed ho trovato un paper in cui veniva descritta una implementazione che utilizzava le versioni parallele di BLAS e Lapack). Nel caso di Matteo, il codice della funzione non è ben leggibile e non riesco a capire, a vista, di che tipo di funzione si tratti (se è lineare o non lineare). Ciao Manlio -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk7FTlcACgkQscQJ24LbaUQHpQCfeHZIO3VqcXBVvh6/acSNiGcB D1IAn3heG4jCm1QvNlhIryQCxwA4FRbM =NVcJ -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
Matteo, oggi ti tempesto... Io non so nulla di calcolo su più core, ma faccio molto i minimi quadrati. Se ti interessa sto sviluppando un sistema semplice per fare tutto da riga di comando, lo trovi qui: https://github.com/gdurin/pyFitting Grazie, ho dato un occhiata veloce ma devo studiarmelo un po' Non sono un informatico/programmatore di professione. Se ho problemi chiedo!?!? ;) la cosa che ti potrebbe aiutare potrebbe essere utilizzare le derivate analitiche (il mio parametro -d), che diminuiscono sensibilmente il numero di passi da far fare alla routine. Oppure prendi spunto per farlo tu (ho usato sympy e numexpr per compilare e ottimizzare il calcolo) Per ogni dettaglio puoi vedere qui in un talk che ho fatto di recente: http://emma.inrim.it:8080/gdurin/talks/fit-the-elefant-on-the-use-of-least-square-methods-from-simple-cases-to-multiparameter-scaling-functions/ Certo, fittare con 22 parametri è un bel problema, ed è proprio fittare un elefante (che pare abbia bisogno di 'soli' 13 parametri). Un problema noto è che spesso molti sistemi (le funzioni teoriche) sono 'sloppy', cioé poco sensibili alle variazioni anche ampie dei parametri. Quindi il fit non si muove mai, soprattutto se hai le derivate (per il calcolo dello jacobiano) numeriche. Inoltre di solito è un casino decidere i valori iniziali, soprattutto nel tuo caso (so che qualcuno usa degli algoritmi genetici per la stima dei valori iniziali, ma non ne so molto). Solitamente inserisco i valori trovati dal tentativo precedente. Questo aiuta un po' Cose biologiche? ciao Gianfranco Ciao Grazie ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
Il 17/11/2011 18:44, Manlio Perillo ha scritto: -BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Il 17/11/2011 17:19, Matteo Perini ha scritto: Ciao lista, Vorrei sapere se è possibile utilizzare tutti i core della cpu per eseguire calcoli gravosi. Si. Come è possibile usare anche tutte le cpu dei computer in una rete. Il come è un altro discorso... Ho guardato un po' in internet e come risposta ho trovato il multithreading che ho già utilizzato un paio di volte. Il multithreading in Python non va bene, a meno di condizioni particolari (cerca su Internet Python GIL). Grazie del consiglio. Però non riesco a capire se è possibile applicarlo anche ad un unico comando. Che intendi come comando? Scusami ma non conosco la terminologia corretta Io per comando intendevo leastsq(e, v0, args=(x,y,phi,z), maxfev=1) Mi spiego meglio. ho una funzione fp non lineare che deve essere ottimizzata... fp = lambda v, x,y, phi:(1+v[0]*phi+v[1]*x+v[2]*x*phi+v[3]*y+v[4]*y*phi+v[5]*x**2... +v[6]*phi*x**2+v[7]*y**2+v[8]*phi*y**2+v[9]*x*y+v[10]*phi*x*y)/(v[11]+v[12]*phi... +v[13]*x+v[14]*x*phi+v[15]*y+v[16]*y*phi+v[17]*x**2+v[18]*phi*x**2+v[19]*y**2... +v[20]*phi*y**2+v[21]*x*y+v[22]*phi*x*y) Scusa, ma perchè usi lambda? Nel tuo caso rende il codice meno leggibile. Fai un più semplice: def fp(v, x, y, phi): ... Le lambda dovrebbero essere usate *solo* se ti serve una funzione anonima (ad esempio per passarla come argomento ad un altra funzione). Ho trovato un paio di esempi on-line, nonche sul sito ufficiale che usavano sempre lambda per passare la funzione a leastsq http://www.scipy.org/scipy_Example_List#head-4c436ae0085d9a56056425d11abff4ccdd3d3620 Quindi ho usato quella. Se ho capito bene potrei usare: def fp(v, x, y, phi): return (1+v[0]*phi+v[1]*x+v[2]*x*phi+v[3]*y+v[4]*y*phi+v[5]*x**2... +v[6]*phi*x**2+v[7]*y**2+v[8]*phi*y**2+v[9]*x*y+v[10]*phi*x*y)/(v[11]+v[12]*phi... +v[13]*x+v[14]*x*phi+v[15]*y+v[16]*y*phi+v[17]*x**2+v[18]*phi*x**2+v[19]*y**2... +v[20]*phi*y**2+v[21]*x*y+v[22]*phi*x*y) Giusto? Devi parallelizzare l'algoritmo, e di solito non è banale. In letteratura dovresti trovare algoritmi per l'ottimizzazione ai minimi quadrati paralleli, magari trovi anche implementazioni già pronte. Una volta che hai l'algoritmo, l'altro problema è l'implementazione (anche questo non banalissimo). Mmmm la vedo mooolto dura per le mie conoscenze. Grazie dei consigli Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Utilizzo completo della cpu
Il 17/11/2011 18:44, Gian Mario Tagliaretti ha scritto: 2011/11/17 Matteo Periniperini.mat...@gmail.com: Ciao lista, ciao Matteo, Vorrei sapere se è possibile utilizzare tutti i core della cpu per eseguire calcoli gravosi. Per usare tutti i core devi usare il modulo multiprocessing (incluso nella libreria dalla 2.7), l'API è simile a quella del modulo threading. ciao Molto interessante questa cosa... proverò a studiarmelo e a fare qualche prova. Grazie Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python