[Python] Evitare cicli annidati....

M@T perini.matteo a gmail.com
Sab 14 Maggio 2011 17:03:26 CEST


On 14/05/2011 16:14, Daniele Varrazzo wrote:
> On Sat, 14 May 2011 12:37:15 +0200, "M a T"<perini.matteo a gmail.com>  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



Maggiori informazioni sulla lista Python