Valores medios en función de binning con respecto a la segunda variable

Estoy trabajando con python / numpy. Como datos de entrada tengo un gran número de pares de valores (x,y) . Básicamente quiero trazar (x) , es decir, el valor medio de y para un determinado contenedor de datos x . En este momento utilizo un plano for bucle para lograr esto, que es terriblemente lento.

 # create example data x = numpy.random.rand(1000) y = numpy.random.rand(1000) # set resolution xbins = 100 # find x bins H, xedges, yedges = numpy.histogram2d(x, y, bins=(xbins,xbins) ) # calculate mean and std of y for each x bin mean = numpy.zeros(xbins) std = numpy.zeros(xbins) for i in numpy.arange(xbins): mean[i] = numpy.mean(y[ numpy.logical_and( x>=xedges[i], x=xedges[i], x<xedges[i+1] ) ]) 

¿Es posible tener un tipo de escritura vectorizada para ello?

Estás complicando las cosas innecesariamente. Todo lo que necesita saber es, para cada bin en x , cuáles son n , sy y sy2 , el número de valores y en ese bin x , la sum de esos valores y y la sum de sus cuadrados. Puedes conseguirlos como:

 >>> n, _ = np.histogram(x, bins=xbins) >>> sy, _ = np.histogram(x, bins=xbins, weights=y) >>> sy2, _ = np.histogram(x, bins=xbins, weights=y*y) 

De esos:

 >>> mean = sy / n >>> std = np.sqrt(sy2/n - mean*mean) 

Si puedes usar pandas:

 import pandas as pd xedges = np.linspace(x.min(), x.max(), xbins+1) xedges[0] -= 0.00001 xedges[-1] += 0.000001 c = pd.cut(x, xedges) g = pd.groupby(pd.Series(y), c.labels) mean2 = g.mean() std2 = g.std(0)