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 :

[numpy] optimiser un filtre pour 2 arrays


Sujet :

Calcul scientifique Python

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut [numpy] optimiser un filtre pour 2 arrays
    bonjour,
    je voudrai optimiser ce code qui met 140 ms à s'executer sur ma bécane.
    surfarray.array_alpha() et surfarray.pixels_alpha() retour des arrays.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def blend_alpha(surface1,surface2):
    	output = surface2.copy().convert_alpha()
    	a = surfarray.array_alpha(surface1)
    	b = surfarray.array_alpha(surface2)
    	for x in range(output.get_width()):
    		for y in range(output.get_height()):
    			if a[x][y]<b[x][y]: surfarray.pixels_alpha(output)[x][y] = a[x][y]
    	return output
    voilà, il faut donc filtrer 2 arrays genre [[5,2,4],[9,7,3],[0,4,8]...] et [[6,7,1],[0,2,7],[9,6,3]...]
    et il faut retourner un array avec les valeurs min: [[5,2,1],[0,2,3],[0,4,3]...]

    merci pour votre aide.

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    c'est bon, j'ai trouvé ... je passe à 20 ms.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def blend_alpha(surface1,surface2):
    	output = surface2.copy().convert_alpha()
    	output_alpha = surfarray.pixels_alpha(output)
    	output_flatten = output_alpha.flatten()
    	S1_flatten = surfarray.array_alpha(surface1).flatten()
    	for i in range(len(S1_flatten)):
    		if S1_flatten[i] < output_flatten[i]: output_flatten[i] = S1_flatten[i]
    	output_alpha[:] = output_flatten.reshape(*surface2.get_size())
    	return output
    désolé d'avoir posté pour rien.

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    On peut aller encore plus vite sur ta dernière boucle for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def blend_alpha(surface1,surface2):
        output = surface2.copy().convert_alpha()
        output_alpha = surfarray.pixels_alpha(output)
        S1 = surfarray.array_alpha(surface1)
        output_alpha[S1<output_alpha] = S1[S1<output_alpha]
        return output
    Pas testé, mais l'indiçage avancé de Numpy permet de se passer de 99% de ton code

    Enfin, j'imagine que c'est du Numpy derrière vu les méthdoes flatten().

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 049
    Points : 1 380
    Points
    1 380
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    On peut aller encore plus vite sur ta dernière boucle for :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def blend_alpha(surface1,surface2):
        output = surface2.copy().convert_alpha()
        output_alpha = surfarray.pixels_alpha(output)
        S1 = surfarray.array_alpha(surface1)
        output_alpha[S1<output_alpha] = S1[S1<output_alpha]
        return output
    Pas testé, mais l'indiçage avancé de Numpy permet de se passer de 99% de ton code

    Enfin, j'imagine que c'est du Numpy derrière vu les méthdoes flatten().
    ALORS LA, J'EN RESTE BABA !!!
    je ne connaissais pas du tout, ça passe à 3 ms !!!

    Trop merci pour l'astuce

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Je t'en prie, on peut sans doute faire mieux en ne calculant S1<alpha_output qu'une seule fois.

Discussions similaires

  1. [XL-2007] Optimiser un USF pour créer déférents critères d'un filtre élaboré
    Par apt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 07/08/2012, 00h16
  2. Filtre pour les dates
    Par aliwassem dans le forum Bases de données
    Réponses: 11
    Dernier message: 21/02/2006, 11h48
  3. [Optimisation]Comment proceder pour une BDD très importante?
    Par XTopheBde dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 04/01/2006, 13h10
  4. Filtres pour GraphEdit
    Par jackjack dans le forum DirectX
    Réponses: 2
    Dernier message: 23/05/2003, 14h45

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