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 :

optimiser le calcul des poids d'un histogramme


Sujet :

Calcul scientifique Python

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 95
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2021
    Messages : 6
    Par défaut optimiser le calcul des poids d'un histogramme
    Hello,

    Je cherche à tracer un histogramme. Je dois calculer le poids de chaque point en fonction du bin dans lequel il va être ajouté. J'ai utilisé le code ci-dessous qui fonctionne mais qui est très lent (opération sur plusieurs Go de données).
    Est-ce qu'il existe une méthode plus efficace que de boucler sur le tableau de données et sur les bins ?


    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
     
    import numpy as np
    import matplotlib.pyplot as plt
     
    # nombre de bins de l'histogramme
    Nbins=20
     
    # valeur max
    xhi=10
     
    # pas
    step=xhi/Nbins
     
    # tableau contenant les centres des bins de l'histogramme
    bins=np.linspace(step/2,xhi+step/2,Nbins+1)
     
    # mes données
    R=np.array([1.0, 6.0, 5.4, 3.0, 2.1, 9.5, 8.0, 1.0, 1.5, 1.7, 2.1, 2.3, 4.8, 4.6, 3.2])
     
    # tableau contenant le poids qui sera associé à chaque valeur
    Weights=[]
     
    for r in R:
        for b in bins: 
            if ((b-step/2) <= r < (b+step/2)): #condition: si le point se trouve dans le bin:
                vol=np.pi*b
                Weights=np.append(Weights,vol) #crée le tableau qui aura la même dimension que R (sauf si une valeur est > xhi, ce qui est embêtant)
     
    plt.hist(R, bins=bins,weights=1/Weights)
    plt.show()
    J'ai finalement utilisé une parade rapide : j'utilise numpy.histogram qui me retourne les valeurs de l'histogramme associées au limites de chaque bin. je calcule ensuite le poids pour chaque bin. C'est un solution acceptable, mais je me demandais s'il y avait une manière plus pythonesque d'écrire cette double boucle. Je pensais à une condition du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ((bins-step/2) <= R < (bins+step/2)).any():
    mais évidemment ça ne marche. Je pose la question uniquement pour le principe, vu que la solution numpy.histogram me convient

    Merci d'avance !

    S.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 679
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 679
    Par défaut
    Salut,

    Citation Envoyé par sanzorairefix Voir le message
    C'est un solution acceptable, mais je me demandais s'il y avait une manière plus pythonesque d'écrire cette double boucle.
    Si vous divisez l'intervalle de 0 a 10 en 20 plages de 5 unités, pour chaque valeur donnée, trouver dans quelle plage/bin la ranger via son index, est le quotient de la division par 5 (+/- les bords).

    Ce qui supprime une boucle.... Et çà n'a rien de "pythonesque".

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2021
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 95
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2021
    Messages : 6
    Par défaut
    Je ne comprends pas trop la première phrase : "divisez l'intervalle de 0 a 10 en 20 plages de 5 unités"

    Mais j'ai compris l'idée. Si je divise ma valeur par le "pas", le quotient me donnera l'index de la plage / bin dans laquelle ranger la valeur. Merci !
    Effectivement, je perds les bons réflexes. Je n'ai pas programmé depuis longtemps et c'est quand même la base comme idée. J'ai oublié de réfléchir sur ce coup, j'ai honte xD

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

Discussions similaires

  1. Calcul des histogrammes avec opencv et java
    Par ekica dans le forum OpenCV
    Réponses: 1
    Dernier message: 29/06/2013, 10h30
  2. Calcul du poids des mois
    Par V i n c e n t dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 20/02/2010, 08h05
  3. [eZ Publish] Calculer des frais de ports en fonction du poid des produits
    Par boubil dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 31/07/2009, 22h30
  4. Calculer le poids des termes
    Par hadjiphp dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2009, 09h40
  5. [MySQL] Calcul des frais de port poids/prix d'un caddie
    Par spawns dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 13/01/2009, 15h58

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