使用Numpy或Scipy的累积产品

Ten*_*Liu -2 python arrays numpy scipy

我有一个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]
Run Code Online (Sandbox Code Playgroud)

然而,当尺寸arr变得非常大时,这可能会变慢.我怀疑使用其中一个NumpyScipy阵列魔法可能会有更有效的方法.有人可以告诉我该怎么做吗?

MSe*_*ert 5

你可以使用numpy.cumprod:

>>> np.cumprod(arr)
array([      1,       2,       6,      24,     120,     720,    5040,
         40320,  362880, 3628800], dtype=int32)
Run Code Online (Sandbox Code Playgroud)

万一你不想使用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]
Run Code Online (Sandbox Code Playgroud)

注意:该itertools.accumulate函数需要python3.