una tutorial recorrer multiplicar matriz matrices funcion español ejemplos crear array arange python arrays numpy cumsum

python - recorrer - numpy tutorial español pdf



Realizar una suma acumulativa inversa en una matriz numpy (4)

Esto lo hace:

np.cumsum(x[::-1])[::-1]

¿Alguien puede recomendar una manera de hacer una suma acumulativa inversa en una matriz numpy?

Donde se define la ''suma acumulada inversa'' como se indica a continuación (acojo con satisfacción cualquier corrección en el nombre para este procedimiento):

Si

x = np.array([0,1,2,3,4])

entonces

np.cumsum(x)

da

array([0,1,3,6,10])

Sin embargo, me gustaría conseguir

array([10,10,9,7,4]

¿Alguien puede sugerir una manera de hacer esto?


Por diversión, usando la función anónima:

array = [0,1,2,3,4] reverse = lambda a: a[::-1] cumsum = lambda a: [ sum(a[:i+1]) for i,x in enumerate(a) ] # there is also an accumulate function present in the itertools module print reverse(array) print cumsum(array) # sadly, no compose function in Python reverse_cumsum = lambda a: reverse( cumsum ( reverse(a) ) ) print reverse_cumsum(array)

Resultado:

[4, 3, 2, 1, 0] [0, 1, 3, 6, 10] [10, 10, 9, 7, 4]


Solo para el registro: np.sum(x) - np.cumsum(x) también es una opción, pero es la mitad de rápida en arreglos grandes (donde la velocidad es importante):

In [8]: x = np.ones(1e8) In [9]: %timeit np.cumsum(x[::-1])[::-1] 1 loops, best of 3: 547 ms per loop In [10]: %timeit np.sum(x) - np.cumsum(x) 1 loops, best of 3: 974 ms per loop

y menos elegante cuando se quiere hacer un cumsum en una dimensión distinta a la primera:

x = np.ones((1e3,1e3)) np.sum(x,axis=-1)[:,np.newaxis] - np.cumsum(x,axis=-1)