Necesito implementar una función para sumar los elementos de una matriz con una longitud de sección variable. Así,cython numpy accumulate function
a = np.arange(10)
section_lengths = np.array([3, 2, 4])
out = accumulate(a, section_lengths)
print out
array([ 3., 7., 35.])
que intentaron una implementación en cython
aquí:
https://gist.github.com/2784725
para un rendimiento estoy comparando a la solución pura numpy
para el caso en que los section_lengths son todos iguales:
LEN = 10000
b = np.ones(LEN, dtype=np.int) * 2000
a = np.arange(np.sum(b), dtype=np.double)
out = np.zeros(LEN, dtype=np.double)
%timeit np.sum(a.reshape(-1,2000), axis=1)
10 loops, best of 3: 25.1 ms per loop
%timeit accumulate.accumulate(a, b, out)
10 loops, best of 3: 64.6 ms per loop
¿Tiene alguna sugerencia para mejorar el rendimiento?
he implementado varias sugerencias, ver la versión actualizada en github: https://gist.github.com/2784725/8e2aaebbaa68c67e7a0686e9c7927f2f5b6f419a, todavía se tarda 63ms, por lo que no significativa mejora –
Podría estar fuera del punto, pero pensé en mencionar ... numpy ya tiene algo parecido a * all * ufuncs. 'np.add.reduceat (a, section_lengths.cumsum())'. Tiene que ser cambiado un poco (cumsum no tiene un 0 al inicio y se obtiene el segmento final extra) y probablemente puedas vencer la velocidad con cython, pero es una característica/truco muy bueno. – seberg