2017-01-10 10 views
-3

私はそれを累積製品に変換したい1-Dのnumpy配列を持っています。しかし、これはarrのサイズが非常に大きくなったときに遅く得ることができますNumpyまたはScipyを使用した累積製品

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] 

:素朴な実装はこのことでしょう。私は、NumpyまたはScipyの配列魔法のいずれかを使って、より効率的な方法があると思います。誰かが私にそれをする方法を示すことができますか?

+10

:[ドキュメント](HTTPS://docs.scipyあなたは最初からこれを行う方法を希望した場合.org/doc/numpy/reference/generated/numpy.cumprod.html)。 – BrenBarn

+0

うわー、私はとても恥ずかしく感じます。私はいくつかの他のキーワードを使ってgoogledして、事を見つけることができませんでした。どうもありがとうございました! –

+0

このアプローチは、それぞれの反復で 'arr'の**スライス**をとっているため、*スライスの積をとって*コピー*するので、あまりスケーリングができません。注意、頻繁にあなた自身を繰り返しています。 forループと 'arr.append'を使用した素朴な実装でさえ、より高速でスケールがはるかに優れています。 –

答えて

3

あなたはnumpy.cumprodを使用することができます。

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

ちょうどあなたがnumpyのを使用したくない、あなたは、むしろ「あなたはニシキヘビ無制限の精度の整数とドンをしたいなどの理由で(純粋なPythonで滞在する場合にはスピードについてはあまりトンのケア)あなたも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が必要です。

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] 
最初にGoogleが "numpyの累積製品" のヒット
関連する問題