我有一个1-D numpy数组,我希望将其转换为累积产品.一个天真的实现是这样的:
import numpy as np arr = [1,2,3,4,5,6,7,8,9,10] c_sum = [np.prod(arr[:i]) for i in range(1, len(arr) + 1)] # c_sum = [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
然而,当尺寸arr
变得非常大时,这可能会变慢.我怀疑使用其中一个Numpy
或Scipy
阵列魔法可能会有更有效的方法.有人可以告诉我该怎么做吗?
你可以使用numpy.cumprod
:
>>> np.cumprod(arr) array([ 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800], dtype=int32)
万一你不想使用numpy而你宁愿留在纯python中(也许是因为你想要pythons无限精度整数并且不太关心速度)你也可以使用itertools.accumulate
:
>>> import itertools >>> import operator >>> list(itertools.accumulate(arr, operator.mul)) [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
注意:该itertools.accumulate
函数需要python3.