¿Existe una forma más eficiente de tomar un promedio de una matriz en contenedores preespecificados? por ejemplo, tengo una matriz de números y una matriz correspondiente a las posiciones inicial y final de la bandeja en esa matriz, ¿y solo quiero tomar la media en esas bandejas? Tengo un código que lo hace a continuación, pero me pregunto cómo se puede reducir y mejorar. Gracias.
from scipy import *
from numpy import *
def get_bin_mean(a, b_start, b_end):
ind_upper = nonzero(a >= b_start)[0]
a_upper = a[ind_upper]
a_range = a_upper[nonzero(a_upper < b_end)[0]]
mean_val = mean(a_range)
return mean_val
data = rand(100)
bins = linspace(0, 1, 10)
binned_data = []
n = 0
for n in range(0, len(bins)-1):
b_start = bins[n]
b_end = bins[n+1]
binned_data.append(get_bin_mean(data, b_start, b_end))
print binned_data
histogram()
método sea más rápido para una gran cantidad de bins. Pero tendrás que perfilarte, no puedo hacer esto por ti.La función Scipy (> = 0.11) scipy.stats.binned_statistic aborda específicamente la pregunta anterior.
Para el mismo ejemplo que en las respuestas anteriores, la solución de Scipy sería
fuente
No estoy seguro de por qué este hilo fue negado; pero aquí hay una respuesta aprobada en 2014, que debería ser mucho más rápida:
fuente
mean[0] = np.mean(data[0:10])
, su , aunque la respuesta correcta debería sernp.mean(data[data < 10])
El paquete numpy_indexed (descargo de responsabilidad: soy su autor) contiene funciones para realizar operaciones de este tipo de manera eficiente:
Esta es esencialmente la misma solución que la que publiqué anteriormente; pero ahora envuelto en una bonita interfaz, con pruebas y todo :)
fuente
Yo agregaría, y también para responder a la pregunta, encuentre los valores medios de bin usando histogram2d python que el scipy también tiene una función especialmente diseñada para calcular una estadística binned bidimensional para uno o más conjuntos de datos
la función scipy.stats.binned_statistic_dd es una generalización de esta función para conjuntos de datos de mayores dimensiones
fuente
Otra alternativa es utilizar ufunc.at. Este método aplica en el lugar una operación deseada en índices específicos. Podemos obtener la posición del contenedor para cada punto de datos utilizando el método searchsorted. Entonces podemos usar at para incrementar en 1 la posición del histograma en el índice dado por bin_indexes, cada vez que encontremos un índice en bin_indexes.
fuente