IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Calcul scientifique Python Discussion :

Aide pour vectoriser une boucle


Sujet :

Calcul scientifique Python

  1. #1
    Hew
    Hew est déconnecté
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 142
    Points : 101
    Points
    101
    Par défaut Aide pour vectoriser une boucle
    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 :

    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)
    Cette boucle n'est pas top et elle prend du temps pour de grand N.
    J'ai essaye de vectoriser de cette maniere :

    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,:])
    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
     
    projection[(t%2) <= np.sqrt(thp)]
    Quand je lance mon script j'obtiens l'erreur suivante :
    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 !

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 048
    Points : 1 378
    Points
    1 378
    Par défaut
    tu peux replacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     if np.abs(tp)<=np.sqrt(a2):
            projection = (2*rho*A*B/a2)*np.sqrt(a2-tp**2)
        else:
            projection = 0
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    projection = (2*rho*A*B/a2)*np.sqrt(a2-tp**2)*(np.abs(tp)<=np.sqrt(a2))

  3. #3
    Hew
    Hew est déconnecté
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    142
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 142
    Points : 101
    Points
    101
    Par défaut
    Merci ! J'ai fini par y arriver

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par Hew Voir le message
    Merci ! J'ai fini par y arriver
    Bonjour,

    Est ce que tu pourrais, stp, mettre ton bout de code?
    Ce serait sympa, cela m'intéresse de voir comment tu as fait.

    Je débute avec Numpy et moi aussi vectoriser les boucle FOR n'est pas mon fort!!

    Bonne journée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Besoin d'aide pour faire une boucle loop sur une macro
    Par spacesheep dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/04/2010, 11h42
  2. [MySQL] Besoin d'aide pour faire une boucle
    Par plex dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 15/04/2008, 13h47
  3. Aide pour créer une boucle
    Par laroche1 dans le forum MATLAB
    Réponses: 2
    Dernier message: 04/12/2007, 15h51
  4. Réponses: 4
    Dernier message: 18/11/2006, 22h58
  5. [VBA-E]besoin d'aide pour faire une boucle
    Par mikazounette dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2006, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo