Ho bisogno di implementare una funzione per sommare gli elementi di un array con una lunghezza di sezione variabile. Così,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.])
ho tentato un'implementazione in cython
qui:
https://gist.github.com/2784725
per le prestazioni che sto paragonando al numpy
soluzione pura per il caso in cui i section_lengths sono tutti uguali:
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
avete qualche suggerimento per migliorare le prestazioni?
ho implementato diversi suggerimenti, vedere versione aggiornata su github: https://gist.github.com/2784725/8e2aaebbaa68c67e7a0686e9c7927f2f5b6f419a, ancora ci vuole 63ms, quindi non significativo miglioramento –
Potrebbe essere off the point, ma ho pensato di menzionare ... Numpy ha già qualcosa di simile ad esso per * all * ufuncs. 'np.add.reduceat (a, section_lengths.cumsum())'. Deve essere cambiato un po '(cumsum manca di 0 all'inizio e si ottiene la fetta finale extra) e probabilmente si può battere la velocità con cython, ma è una caratteristica/trucco molto bella. – seberg