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:
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:
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.