我有一个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
阵列魔法之一可能会有更有效的方法。有人可以告诉我该怎么做吗?
答案 0 :(得分:5)
您可以使用numpy.cumprod
:
>>> np.cumprod(arr)
array([ 1, 2, 6, 24, 120, 720, 5040,
40320, 362880, 3628800], dtype=int32)
万一你不想使用numpy而你宁愿呆在纯蟒蛇中(也许是因为你想要pythons无限精确整数并且不太关心速度)你也可以使用{ {3}}:
>>> import itertools
>>> import operator
>>> list(itertools.accumulate(arr, operator.mul))
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]
注意:itertools.accumulate
函数需要python3。
答案 1 :(得分:0)
有人已经建议np.cumprod
。如果您想从头开始这样做:
L = [1,2,3,4,5,6,7,8,9,10]
answer = []
curr = 1
for i in L:
curr *= i
answer.append(curr)
输出:
In [33]: answer
Out[33]: [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]