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