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)
También puede usar .flipud()
para esto, que es equivalente a [::-1]
https://docs.scipy.org/doc/numpy/reference/generated/numpy.flipud.html
In [0]: x = np.array([0,1,2,3,4])
In [1]: np.flipud(np.flipud(x).cumsum())
Out[1]: array([10, 10, 9, 7, 4]
.flip()
es nuevo a partir de NumPy 1.12, y combina .flipud()
y .fliplr()
en una API. https://docs.scipy.org/doc/numpy/reference/generated/numpy.flip.html
Esto es equivalente, y tiene menos llamadas a funciones:
np.flip(np.flip(x, 0).cumsum(), 0)