リストの理解(または別のコンパクトなアプローチ)を使用してこの単純な関数を複製する最良の方法は何ですか? Pythonの3ではアキュムレータを使用したリストの理解
import numpy as np
sum=0
array=[]
for i in np.random.rand(100):
sum+=i
array.append(sum)
リストの理解(または別のコンパクトなアプローチ)を使用してこの単純な関数を複製する最良の方法は何ですか? Pythonの3ではアキュムレータを使用したリストの理解
import numpy as np
sum=0
array=[]
for i in np.random.rand(100):
sum+=i
array.append(sum)
、あなたはitertools.accumulate()
を使用したい:
from itertools import accumulate
array = list(accumulate(rand(100)))
累積が第1の値から始まる、反復可能な入力の値を加算の実行されている結果が得られます。
>>> from itertools import accumulate
>>> list(accumulate(range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
第2引数として別の操作を渡すことができます。これは、累積結果と次の値を取り、新しい累積結果を返す呼び出し可能でなければなりません。 operator
moduleは、この種の作業に標準の数学演算子を提供するのに非常に役立ちます。あなたは、たとえば実行中の乗算結果を生成するためにそれを使用することができます。
>>> import operator
>>> list(accumulate(range(1, 10), operator.mul))
[1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
機能は、旧バージョン(Pythonの2、またはPythonの3.0または3.1)にバックポートするのは簡単です:
# Python 3.1 or before
import operator
def accumulate(iterable, func=operator.add):
'Return running totals'
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
total = next(it)
yield total
for element in it:
total = func(total, element)
yield total
これは動作しますが、私はipythonコマンドラインのように、コンパクトな使用のためのリストの理解のようなものを探していました。 – Pierz
@Pierz: 'accumulate()'イテレータで 'list()'を使用して、値の簡単なリストを提供しました。リスト内包でもそれを使うことができます。 '' vの蓄積のためのv(rand(100)) ';しかし、これまでに生成された前の要素にアクセスすることはできないため、リストの理解だけで*これを行うことはできません。 –
真実ですが、エレガントなアプローチですが、累積された合計をリスト内包にするためのきちんとした方法があるかどうかはわかりませんでした。基本的にはベストプラクティスではないと言いますが、コマンドラインで作業する場合はコンパクトなフォームを使用すると便利です。 – Pierz
ますので、すでにnumpy
を使っている、あなたはcumsum
を使用することができます。
>>> from numpy.random import rand
>>> x = rand(10)
>>> x
array([ 0.33006219, 0.75246128, 0.62998073, 0.87749341, 0.96969786,
0.02256228, 0.08539008, 0.83715312, 0.86611906, 0.97415447])
>>> x.cumsum()
array([ 0.33006219, 1.08252347, 1.7125042 , 2.58999762, 3.55969548,
3.58225775, 3.66764783, 4.50480095, 5.37092001, 6.34507448])
[OK]を、あなたがnumpy
をしたくなかったが、ここで私の解決策はとにかくであると述べました。 あなたは単純に累積合計を取っているので、cumsum()
関数を使用しているようです。
import numpy as np
result = np.cumsum(some_array)
result = np.cumsum(np.random.uniform(size=100))
あなたは万が一numpyの使用していますか?私はnumpyがこのようなものに対して素晴らしい機能を持っていることを知っています。 – arshajii
私はリストの理解を使用しません - 要素は互いに独立していると予想され、この場合はそうではありません。 – Izkata
なぜこれをリストの理解に変えたいですか?別のループでこれを保持する方がはるかに読みやすくなります。 'array = [0]'、 'for i for rand(100):array.append(i + array [-1])'のようにしてください。 –