generalized cumulative functions in NumPy/SciPy?

前端 未结 2 537
一个人的身影
一个人的身影 2020-12-01 14:34

Is there a function in numpy or scipy (or some other library) that generalizes the idea of cumsum and cumprod to arbitrary function. For example, consider the (theoretical)

相关标签:
2条回答
  • 2020-12-01 14:49

    The ValueError above is still a bug using Numpy 1.17.2 (with Python 3.7.3).

    Luckily a workaround was discovered that uses casting: https://groups.google.com/forum/#!topic/numpy/JgUltPe2hqw

    import numpy as np
    uadd = np.frompyfunc(lambda x, y: x + y, 2, 1)
    uadd.accumulate([1,2,3], dtype=np.object).astype(np.int)
    # array([1, 3, 6])
    

    Note that since the custom operation works on np.object, it won't benefit from the efficient memory management of numpy. So the operation may be slower than one that didn't need casting to object for extremely large arrays.

    0 讨论(0)
  • 2020-12-01 14:57

    NumPy's ufuncs have accumulate():

    In [22]: np.multiply.accumulate([[1, 2, 3], [4, 5, 6]], axis=1)
    Out[22]: 
    array([[  1,   2,   6],
           [  4,  20, 120]])
    

    Unfortunately, calling accumulate() on a frompyfunc()'ed Python function fails with a strange error:

    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'
    

    This is using NumPy 1.6.1 with Python 2.7.3.

    0 讨论(0)
提交回复
热议问题