[Python] Evitare cicli annidati....

Daniele Varrazzo piro a develer.com
Sab 14 Maggio 2011 16:14:21 CEST


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)
> 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


Maggiori informazioni sulla lista Python