python - not - Funciones acumuladas generalizadas en NumPy/SciPy?
numpy loadtxt could not convert string to float (2)
¿Existe una función en numpy o scipy (o alguna otra biblioteca) que generalice la idea de cumsum y cumprod a una función arbitraria? Por ejemplo, considere la función (teórica)
cumf( func, array)
func es una función que acepta dos flotantes y devuelve un flotador. Casos particulares
lambda x,y: x+y
y
lambda x,y: x*y
son cumsum y cumprod respectivamente. Por ejemplo, si
func = lambda x,prev_x: x^2*prev_x
y lo aplico a:
cumf(func, np.array( 1, 2, 3) )
Me gustaría
np.array( 1, 4, 9*4 )
El ValueError anterior sigue siendo un error al usar Numpy 1.9.1 (con Python 2.7.9).
Afortunadamente, se descubrió una solución alternativa que utiliza la conversión: https://groups.google.com/forum/#!topic/numpy/JgUltPe2hqw
In [34]: uadd = np.frompyfunc(lambda x, y: x + y, 2, 1)
In [35]: uadd.accumulate([1,2,3], dtype=np.object).astype(np.int)
Out[35]: array([1, 3, 6])
Los ufuncs de NumPy han accumulate()
:
In [22]: np.multiply.accumulate([[1, 2, 3], [4, 5, 6]], axis=1)
Out[22]:
array([[ 1, 2, 6],
[ 4, 20, 120]])
Desafortunadamente, al llamar frompyfunc()
accumulate()
en una función de Python ed de frompyfunc()
un error extraño:
In [32]: uadd = np.frompyfunc(lambda x, y: x + y, 2, 1)
In [33]: uadd.accumulate([1, 2, 3])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
ValueError: could not find a matching type for <lambda> (vectorized).accumulate,
requested type has type code ''l''
Esto es usar NumPy 1.6.1 con Python 2.7.3.