Comment obtenir des données dans un bac d'histogramme
Je veux obtenir une liste des données contenues dans un histogramme de la corbeille. Je suis à l'aide de numpy et Matplotlib. Je sais comment parcourir les données et de vérifier la corbeille de bords. Cependant, je tiens à le faire pour un histogramme 2D et le code pour faire cela est plutôt laid. Ne numpy avez des constructions pour rendre cela plus facile?
Pour le cas 1D, je peux utiliser searchsorted(). Mais la logique n'est pas beaucoup mieux, et je n'ai pas vraiment envie de faire une recherche binaire sur chaque point de données quand je n'ai pas d'.
La plupart des méchants de la logique est due à la poubelle les régions limitrophes. Toutes les régions ont des frontières, comme ceci: [le bord gauche, le bord droit). À l'exception de la dernière bin, qui a une région comme ceci: [le bord gauche, le bord droit].
Voici un exemple de code pour le cas 1D:
import numpy as np
data = [0, 0.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5, 3]
hist, edges = np.histogram(data, bins=3)
print 'data =', data
print 'histogram =', hist
print 'edges =', edges
getbin = 2 #0, 1, or 2
print '---'
print 'alg 1:'
#for i in range(len(data)):
for d in data:
if d >= edges[getbin]:
if (getbin == len(edges)-2) or d < edges[getbin+1]:
print 'found:', d
#end if
#end if
#end for
print '---'
print 'alg 2:'
for d in data:
val = np.searchsorted(edges, d, side='right')-1
if val == getbin or val == len(edges)-1:
print 'found:', d
#end if
#end for
Voici un exemple de code pour le 2D cas:
import numpy as np
xdata = [0, 1.5, 1.5, 2.5, 2.5, 2.5, \
0.5, 0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, \
0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 3]
ydata = [0, 5,5, 5, 5, 5, \
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, \
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30]
xbins = 3
ybins = 3
hist2d, xedges, yedges = np.histogram2d(xdata, ydata, bins=(xbins, ybins))
print 'data2d =', zip(xdata, ydata)
print 'hist2d ='
print hist2d
print 'xedges =', xedges
print 'yedges =', yedges
getbin2d = 5 #0 through 8
print 'find data in bin #', getbin2d
xedge_i = getbin2d % xbins
yedge_i = int(getbin2d / xbins) #IMPORTANT: this is xbins
for x, y in zip(xdata, ydata):
# x and y left edges
if x >= xedges[xedge_i] and y >= yedges[yedge_i]:
#x right edge
if xedge_i == xbins-1 or x < xedges[xedge_i + 1]:
#y right edge
if yedge_i == ybins-1 or y < yedges[yedge_i + 1]:
print 'found:', x, y
#end if
#end if
#end if
#end for
Est-il un nettoyant /moyen plus efficace pour ce faire? Il semble que numpy aurait quelque chose pour cela.
source d'informationauteur Ben
Vous devez vous connecter pour publier un commentaire.
numériser
de base, NumPy, vous donnera la indice de la cellule à laquelle chaque valeur dans votre histogramme appartient:comment au sujet de quelque chose comme:
avec un peu de code pour gérer les cas de bord.
pyplot.hist dans matplotlib crée un histogramme (mais aussi l'attire à l'écran, ce qui vous ne pourriez pas vouloir). Uniquement pour les bacs, vous pouvez utiliser numpy.histogramme, comme indiqué dans une autre réponse.
Ici est un exemple comparant pyploy.hist et numpy.histogramme.