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 ?
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
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()
mais évidemment ça ne marche. Je pose la question uniquement pour le principe, vu que la solution numpy.histogram me convient
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if ((bins-step/2) <= R < (bins+step/2)).any():
Merci d'avance !
S.
Partager