您正在寻找Haskell scanl1
在Python中的替代方案(Haskell示例):
Prelude> scanl1 (\a b -> a + (b - a) * 0.5) [2, 3, 5, 8, 3, 5] [2.0,2.5,3.75,5.875,4.4375,4.71875]
模块中有一个accumulate
功能itertools
:
In [1]: import itertools In [2]: itertools.accumulate([2, 3, 5, 8, 3, 5], lambda a, b: a + (b - a) * 0.5) Out[2]:In [3]: list(itertools.accumulate([2, 3, 5, 8, 3, 5], lambda a, b: a + (b - a) * 0.5)) Out[3]: [2, 2.5, 3.75, 5.875, 4.4375, 4.71875]
使用NumPy,您可以使用numpy.ufunc.accumulate
函数,但是,根据这个答案,实现中存在一个错误,这就是我们应该使用强制转换的原因.不幸的是,我对NumPy不是很熟悉,而且可能有更好的方法:
In [9]: import numpy as np In [10]: uf = np.frompyfunc(lambda a, b: a + (b - a) * 0.5, 2, 1) In [11]: uf.accumulate([2,3,5,8,3,5], dtype=np.object).astype(np.float) Out[11]: array([ 2. , 2.5 , 3.75 , 5.875 , 4.4375 , 4.71875])