使用Numpy或Scipy的累积产品

时间:2017-01-10 18:39:58

标签: 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]

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

2 个答案:

答案 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]