Bonjour !
Je debute en Python, et vectoriser des boucles for ca n'a jamais ete mon fort (mouhahaha).
Bref, je voudrais rendre mon code plus rapide en vectorisant la boucle suivante :
Cette boucle n'est pas top et elle prend du temps pour de grand N.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 def Projection(t,theta,P): x1 = P[0] y1 = P[1] A = P[2] B = P[3] alpha = np.pi*P[4]/180 rho = P[5] s = np.sqrt(x1**2+y1**2) gamma = np.arctan2(y1,x1) thp = theta - alpha tp = t - s*np.cos(gamma-theta) a2 = A**2*(np.cos(thp))**2+B**2*(np.sin(thp))**2 if np.abs(tp)<=np.sqrt(a2): projection = (2*rho*A*B/a2)*np.sqrt(a2-tp**2) else: projection = 0 return projection N = 256 #size of the matrix Proj = np.zeros((10,N,N)) T = np.linspace(-1,1,N) for e in range(10): #for all the ellipse for thet in range(N): #for all the angles theta = np.pi*thet/N for tt in range(N): #for all the samples t = T[tt] Proj[e,thet,tt] = Projection(t,theta,phantom[e,:]) Sino = Proj.sum(axis=0)
J'ai essaye de vectoriser de cette maniere :
Mais le probleme c'est l'evaluation de ma condition "if" dans la definition de Projection (enfin je pense), j'ai donc modifie en remplacant tout ce qui etait dans le "if,else" par :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 theta = np.linspace(0,math.pi,N) t = np.linspace(-1,1,N) T,TH = pyl.meshgrid(t,theta) T = T.flatten(1) TH = TH.flatten(1) projMat = np.zeros((10,N,N)) for e in range(10): projMat[e,:,:] = Projection(T,TH,phantom[e,:])
Quand je lance mon script j'obtiens l'erreur suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 projection[(t%2) <= np.sqrt(thp)]
Traceback (most recent call last):
File "hw2v3.py", line 46, in <module>
projMat[e,:,:] = Projection(T,TH,phantom[e,:])
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Je me doute bien que ma matrice projMat n'a pas la bonne dimension pour faire ce que je veux faire, mais je bloque un peu...
Merci pour votre aide !
Partager