[Python] Evitare cicli annidati....
Ciao, ho un problema, dovuto molto probabilmente alla mia inesperienza, che credo mi allunghi parecchio i tempi di esecuzione del programma. Ho un ciclo annidato di questo tipo: matrixdata=np.array(matrix,dtype='int') fase=np.zeros(matrixdata.shape) for riga in range(matrixdata.shape[0]): A=matrixdata[riga] cw=wavelet(A) cwt=cw.getdata() val=cwt.__abs__() x=np.arange(val.shape[1]) y=val.argmax(0) for i in x: fase[riga,i]=np.arctan2(cwt[y[i],x[i]].imag,cwt[y[i],x[i]].real) print 'ciclo',h,'di',matrixdata.shape[0] dove per ogni riga di una matrice vado a compiere una trasformata wavelet unidimensionale dalla quale si ottene (getdata) una matrice (NxM). Questa, con alcune operazioni, va rieaborata per ottenere una nuova riga (vettore) che deve prendere, in una nuova matrice (fase), la stessa posizione che aveva la riga di origine. Questa procedura va fatta per ogni riga della matrice di pertenza con lo scopo di ottenere una seconda matrice (trasformata) di identiche dimensioni. Avrei bisogno di aumentare un pochino le prestazioni, adesso la rielaborazione di una matrice 1024 x 1024 ci mette un paio di minuti. In realtà l'operazione wavelet è molto veloce è la riassegnazione col secondo ciclo for che "ruba molto tempo". Per questo vi vorrei chiedere se conoscete tecniche o metodi per ovviare ai due cicli (qualsiasi proposta di ottimizzazione del codice è ben accetta) Grazie Matteo P ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Evitare cicli annidati....
M@T wrote: Avrei bisogno di aumentare un pochino le prestazioni, adesso la rielaborazione di una matrice 1024 x 1024 ci mette un paio di minuti. In realtà l'operazione wavelet è molto veloce è la riassegnazione col secondo ciclo for che "ruba molto tempo". numpy offre numerose opzioni per non scrivere cicli ma applicare le trasformazioni 'globalmente'. Guardaci dentro. -- . ..: -enrico- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] personalizzare DIA
proposta molto interessante... Il giorno 14 maggio 2011 08:32, Matteo Boscolo ha scritto: > be dico anche la mia ... > > e mettere tutta sta roba dentro pythonCAD ??? > > ciao > Matteo > > Il 29/04/2011 10:34, Riccardo mancuso ha scritto: > > realizzare e risolvere reti di questo tipo, può essere poi generalizzato > anche per altre tipologie di problemi della fisica: dalle reti termiche a > quelle meccaniche, a quelle idrauliche ecc. secondo i cosìddetti "bond > graph" (che rappresentano una generalizzazione di quanto prima detto) > Il tutto è molto affascinante dal punto di vista applicativo e lo è ancor > più se si riesce a implementare con software open source. > > > > Il giorno 28 aprile 2011 20:02, Giorgio Zoppi ha > scritto: > >> Grazie...non ci avevo mai pensato...PyDia: >> http://dia-installer.de/howto/python_win32/ >> ___ >> Python mailing list >> Python@lists.python.it >> http://lists.python.it/mailman/listinfo/python >> > > > ___ > Python mailing > listPython@lists.python.ithttp://lists.python.it/mailman/listinfo/python > > > > Nessun virus nel messaggio. > Controllato da AVG - www.avg.com > Versione: 10.0.1209 / Database dei virus: 1500/3603 - Data di rilascio: > 28/04/2011 > > > > ___ > 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] Evitare cicli annidati....
On Sat, 14 May 2011 12:37:15 +0200, "M@T" wrote: (Scusa lo sporchettamento di questa email...) Ho messo dei commenti per cercare di seguire le dimensioni della matrice. Se vuoi continuare questo post, per favore commenta anche le altre righe, perché non so cosa faccia la funzione 'wavelet()'. > matrixdata=np.array(matrix,dtype='int') > fase=np.zeros(matrixdata.shape) > for riga in range(matrixdata.shape[0]): > A=matrixdata[riga] > cw=wavelet(A) > cwt=cw.getdata() # NxM complex, giusto? > val=cwt.__abs__()# NxM real - puoi usare abs(cwt) credo In questa parte, che sembra la ciccia da ottimizzare: > x=np.arange(val.shape[1])# [0,1,..M-1] > y=val.argmax(0) # vettore di M indici > for i in x: > fase[riga,i]=np.arctan2(cwt[y[i],x[i]].imag,cwt[y[i],x[i]].real) sono abbastanza sicuro (non 100%, perchè non ho capito bene cosa finisca in y) che tu possa scrivere questo come tipo: fase[riga] = np.arctan2(np.imag(cwt[?]), np.real(cwt[?])) in modo da far srotolare questo loop al C. cwt[x] dovrebbe essere qualcosa che ha la stessa forma di fase[riga]. Se capisco bene, y[i] è la posizione del valore di modulo massimo nella colonna i. x[i] è solo i invece. Tu vuoi prendere il numero complesso col modulo massimo per ogni colonna di cwt e salvarne la fase. Su questa pila di assunzioni e spolverando quello che ricordo, mi sembra tu possa fare: cwtmax = y.choose(cwt) fase[riga] = np.arctan2(np.imag(cwtmax), np.real(cwtmax)) dove y.choose (http://docs.scipy.org/doc/numpy/reference/generated/numpy.choose.html) a occhio sembra faccia il broadcast di dimensioni che serve a te. Ovvero, in un esempio fatto coi reali: a è una matrice casuale di numeri [-0.5..0.5]: array([[ 0.25130797, 0.21050261, -0.44835267, 0.2643408 ], [-0.30653352, -0.15036878, 0.34683264, 0.34859056], [ 0.32359279, -0.4676089 , -0.37165642, 0.08612426]]) y = abs(a).argmax(0) = array([2, 2, 0, 1]) (vettore degli indici delle righe del massimo di ogni colonna) y.choose(a) = array([ 0.32359279, -0.4676089 , -0.44835267, 0.34859056]) sembra quello che volevo: l'elemento col massimo valore assoluto per ogni colonna di a. C'è da vedere se quello che volevo io era la stessa cosa che volevi tu... :) -- 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] Evitare cicli annidati....
On 14/05/2011 16:14, Daniele Varrazzo wrote: On Sat, 14 May 2011 12:37:15 +0200, "M@T" wrote: (Scusa lo sporchettamento di questa email...) Ho messo dei commenti per cercare di seguire le dimensioni della matrice. Se vuoi continuare questo post, per favore commenta anche le altre righe, perché non so cosa faccia la funzione 'wavelet()'. matrixdata=np.array(matrix,dtype='int') fase=np.zeros(matrixdata.shape) matrixdata NxM int for riga in range(matrixdata.shape[0]): A=matrixdata[riga] A (array di M componenti) cw=wavelet(A) cwt=cw.getdata() # NxM complex, giusto? se matrixdata è NxM, in generale cwt è RxM con R dipendente da parametri della trasformata. val=cwt.__abs__()# NxM real - puoi usare abs(cwt) credo Ci sono differenze tra i due modi di ottenere lo stesso risultato In questa parte, che sembra la ciccia da ottimizzare: SI esatto! x=np.arange(val.shape[1])# [0,1,..M-1] y=val.argmax(0) # vettore di M indici for i in x: fase[riga,i]=np.arctan2(cwt[y[i],x[i]].imag,cwt[y[i],x[i]].real) sono abbastanza sicuro (non 100%, perchè non ho capito bene cosa finisca in y) che tu possa scrivere questo come tipo: fase[riga] = np.arctan2(np.imag(cwt[?]), np.real(cwt[?])) Ok... il mio problema (era) cosa mettere al posto del punto di domanda (avevo optato per il ciclo) in modo da far srotolare questo loop al C. cwt[x] dovrebbe essere qualcosa che ha la stessa forma di fase[riga]. Se capisco bene, y[i] è la posizione del valore di modulo massimo nella colonna i. x[i] è solo i invece. Tu vuoi prendere il numero complesso col modulo massimo per ogni colonna di cwt e salvarne la fase. Su questa pila di assunzioni e spolverando quello che ricordo, mi sembra tu possa fare: Hai capito benissimo anzi scusate ma le mie doti di oratore sono piuttosto limitate... cwtmax = y.choose(cwt) fase[riga] = np.arctan2(np.imag(cwtmax), np.real(cwtmax)) CHOOSE! grazie! (quante cose ho da imparare) dove y.choose (http://docs.scipy.org/doc/numpy/reference/generated/numpy.choose.html) a occhio sembra faccia il broadcast di dimensioni che serve a te. Ovvero, in un esempio fatto coi reali: a è una matrice casuale di numeri [-0.5..0.5]: array([[ 0.25130797, 0.21050261, -0.44835267, 0.2643408 ], [-0.30653352, -0.15036878, 0.34683264, 0.34859056], [ 0.32359279, -0.4676089 , -0.37165642, 0.08612426]]) y = abs(a).argmax(0) = array([2, 2, 0, 1]) (vettore degli indici delle righe del massimo di ogni colonna) y.choose(a) = array([ 0.32359279, -0.4676089 , -0.44835267, 0.34859056]) sembra quello che volevo: l'elemento col massimo valore assoluto per ogni colonna di a. C'è da vedere se quello che volevo io era la stessa cosa che volevi tu... :) Era quello! grazie ancora! Ciao Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Evitare cicli annidati....
On Sat, 14 May 2011 17:03:26 +0200, "M@T" wrote: >>> val=cwt.__abs__()# NxM real - puoi usare abs(cwt) credo > Ci sono differenze tra i due modi di ottenere lo stesso risultato No, il risultato è lo stesso, ma __abs__() è un dettaglio implementativo. > Era quello! grazie ancora! Funziona? Di quanto è più veloce? -- 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] Evitare cicli annidati....
On 14/05/2011 17:46, Daniele Varrazzo wrote: On Sat, 14 May 2011 17:03:26 +0200, "M@T" wrote: val=cwt.__abs__()# NxM real - puoi usare abs(cwt) credo Ci sono differenze tra i due modi di ottenere lo stesso risultato No, il risultato è lo stesso, ma __abs__() è un dettaglio implementativo. Ok cambiato. Era quello! grazie ancora! Funziona? Di quanto è più veloce? Appena funziona ti faccio sapere ;) Arghhh lo sapevo che avevo esultato troppo presto. la seconda riga mi da questo errore y=abs(cwt).argmax(0) cwtmax=np.choose(y,cwt) Traceback (most recent call last): File "WL2.py", line 56, in cwtmax=np.choose(y,cwt) File "/usr/lib/pymodules/python2.7/numpy/core/fromnumeric.py", line 296, in choose return choose(choices, out=out, mode=mode) ValueError: Need between 2 and (32) array objects (inclusive). Sto cercando in rete ma nelle doc non trovo niente riguardo ad una limitazione di 32 righe della matrice cwt. Se uso cwt 31xN non ci sono problemi! funziona (mi sembra un po' limitante) Consigli? a qualcuno è capitato? Ciao Grazie Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] StaticText esterno a StaticBoxSizer
Ciao a tutti. class Client(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent,size=(200, 200)) lbox = wx.StaticBox(self, -1, 'Dati cliente ', size=(100, 100), pos=(0,10)) lboxsizer = wx.StaticBoxSizer(lbox, wx.VERTICAL) lboxsizer.Add(wx.StaticText(self, label="Nome: ")) Non riesco a capire come mai la mia "etichetta" non venga messa all'interno del mio lbox Dove sbaglio? Grazie ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] Evitare cicli annidati....
On Sat, 14 May 2011 18:07:35 +0200, "M@T" wrote: > On 14/05/2011 17:46, Daniele Varrazzo wrote: > Appena funziona ti faccio sapere ;) > > Arghhh lo sapevo che avevo esultato troppo presto. > > la seconda riga mi da questo errore > y=abs(cwt).argmax(0) > cwtmax=np.choose(y,cwt) > Se uso cwt 31xN non ci sono problemi! funziona (mi sembra un po' limitante) > Consigli? Uhm, forse la cosa è ancora più semplice. Se X e Y sono array di indici di righe e colonne, A[X,Y] restituisce un array di elementi di A, con la stessa forma di X ed Y. Quindi cwtmax = cwt(y, np.arange(cwt.shape[1])) sembra di nuovo quello che cerchi. -- 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] personalizzare DIA
Il 14/05/2011 12:57, Riccardo mancuso ha scritto: oposta molto interessante... se avete vogli di parlarne ... io ci sono :-) ciao e buona domenica .. Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
[Python] PythonCAD a europython 2011
Salve a tutti, la presente per informarvi che a Giugno ad europython2011 ci sarà anche PythonCAD fra i vari talk proposti ... :-) questo e' il calendario dell'evento http://ep2011.europython.eu/p3/schedule/ep2011/ e questo e' il talk http://ep2011.europython.eu/conference/talks/developing-a-cad-application-as-hobby Naturalmente ci sarò anche io :-) ciao a tutti e buon europython2011 :-))) Matteo ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python