2017-09-17 13 views
0

私は、次のPython 3のコードました:forループの最後のアイテムの平均を計算するには?

import random 
import numpy as np 
data = [] 
for i in range(0, 100): 
    value = random.randrange(100) 
    avg10 = np.average(data[:-10]['value']) 
    data += [{'value': value, 'avg10': avg10}] 

最後の10項目の平均値と一緒に、リスト内の100個の乱数を生成することを目指しています。

残念ながら、コードがで失敗します。私は(すべて10が利用できない場合は以下の項目)辞書のリストから10の最後の値項目にアクセスし、それを渡すことができるかわからないよう

Traceback (most recent call last): 
    File "avg_test.py", line 6, in <module> 
    avg10 = np.average(data[:-10]['value']) 
TypeError: list indices must be integers or slices, not str 

numpyのaverage機能に変換します。その上

[{'value': 11, 'avg10': 11}, {'value': 62, 'avg10': 36.5}, {'value': 56, 'avg10': 43}, {'value': 48, 'avg10': 44.25}, {'value': 43, 'avg10': 41.8}]

と:

だから例えば私のような出力に何かを期待しています。

ここで、avg10は、現在のもの(現在のものを含むことが理想的ですが、これを含む必要はありません)からの相対的な(少なくとも)10項目の平均です。前の要素が1つだけの場合は、1要素の平均です(2つの値の平均値など)(最後の10項目の平均が最大)。

この場合、正しい構文は何でしょうか?

+0

あなたは 'avg10 = np.average(値[ - 10])もしかして'? –

+0

そうでなければ、「最後の10」と言うとき、1000要素(100倍10)の合計を意味しますか? –

+0

@cᴏʟᴅsᴘᴇᴇᴅしかし、 'value'は' data'リストに格納されている単一の値なので、最後の10項目にアクセスするにはリストからアクセスする必要があります。 – kenorb

答えて

1

ディクテーションソリューションを維持し、最初のスライスに問題が生じないようにするには、以下を実行します。

あなたのライン:

avg10 = np.average([data[j]['value'] if j>=0 else value for j in range(i-10, i) ]) 

しかし、利用可能な10の以前の結果がないので、これは、あなたがmean 10の以前の結果の平均されていない原因になります..:

avg10 = np.average(data[:-10]['value']) 

があるべき。
注:最初の値には平均値が含まれていますが、の2番目のは最後に使用可能なものが10個あるため、最後はです。したがって、最初の2つの値はそれ自体が平均値になります。これはおかしい。あなたが平均の最後の10内の値そのものを含めることにした場合あなたは

avg10 = np.average([data[j]['value'] if j>=0 else firstAverage for j in range(i-10, i) ])

でこの動作を変更することを決定することができる(すなわち、{値;そして、そこには前のアイテムを持っていない最初の項目()のためのより多くの例外はありません、あなたが行うことができます)最後の9つの項目と値自体}の意味:あなたはあなたの質問を編集することができます。この最後の場合

for i in range(0, 100): 
    value = random.randrange(100) 
    lasts = [data[j]['value'] for j in range(i-9, i) if j>=0] 
    lasts.append(value) 
    avg10 = np.average(lasts) 
    data += [{'value': value, 'avg10': avg10}] 

)もっと正確に;)

+0

あなたは正しいです、私は編集しました、それは最初の項目でした。前の項目が全くないので、あなたはその場合に何をすべきかを決める必要があります。これは例外です。私はそれ自体を意味すると決めました。 – mquantin

+0

新しい編集。 'data [0]' – mquantin

0

エラーメッセージは、「リストインデックスは、strではなく整数またはスライスでなければなりません」というヒントを提供します。つまり、リストのインデックスとして文字列を使用している場所を探す必要があります。

dataはdictsのリストです。したがって、data[:-10]は辞書のリストです。つまり、data[:-10]['value']は意味をなさないものです。代わりに[x['value'] for x in data[:-10]]のようなものが必要で、dictsのリストを反復処理します。

+0

はい、これは私が言っていることですが、最初の10項目については、 'RuntimeWarning:Mean of empty slice'を生成するので問題があります。それを避ける方法はありますか?また、最後の最初の10項目について平均値を正確に計算すると同時に? – kenorb

1

あなたがやろうとしていることは、リストを使って簡単に達成できると思います。

values = [random.randrange(100)] 
avgs = values.copy() 
for i in range(1, 100): 
    value = random.randrange(100) 
    avg10 = np.average(values[:-10] if len(values) > 10 else values) 

    values.append(value) 
    avgs.append(avg10) 

valuesが10個未満の場合は、明示的にチェックする必要があります。

0
import random 
import numpy as np 
data = [] 
for i in range(0, 100): 
    values = np.random.uniform(0, 100, size=100) 
    value = random.randrange(100) 
    avg10 = np.average(values[max(value-9,0):value+1]) 
    data += [{'value': value, 'avg10': avg10}] 
+0

Hmmを含めるには 'j> = 0'でしたが、最初の項目の平均値が正しく計算されていないと思います。 {{'value':1、 'avg10':49.686383642577212}、{'value':0、 'avg10':48.589859834652742} 'または{{'value':52、 'avg10':52.935084257804498}'なぜ。 – kenorb

+0

'value'と' avg10'の関係はどういうものですか?あなたは最後の10項目の平均とランダムな値を探していますか? – Sina

+0

'avg10'は現在のアイテムと比較して最後の10アイテム(現在のものを含む)の平均です – kenorb

0

ここでは、この

import random 
import numpy as np 

data = [] 
for i in range(0, 100): 
    value = random.randrange(100) 
    avg10 = np.average(range(value+1)[-10:]) if value !=0 else 0 
    data.append({'value': value, 'avg10': avg10}) 
print(data) 
+0

ランダムな値を使って範囲を変更するのはなぜですか?平均値が正しくありません。例えば、 '[{'value':44、 'avg10':38.5}、{'value':18、 'avg10':12.5}' ... – kenorb

+0

更新された回答を試してください –

+0

range value + 1)[ - 10:]は最後の10個の値を返します。たとえば、値が10の場合、これは[10,9,8,7,6,5,4,3,2,1]を返します。 –

1

を試し平均も考慮に現在の値をとり、完全なソリューションです:

import random 
import numpy as np 
data = [] 
for i in range(0, 200): 
    value = random.randrange(100) 
    avg10 = np.average([x['value'] for x in data[-min(len(data), 10):]] + [value]) 
    data += [{'value': value, 'avg10': avg10}] 

基本的にnp.average()が平均化されるデータを含む配列、そのリストを受け入れlist comprehensionsを使用して辞書のフラットリストに変換する必要があります。範囲の場合、現在のサイズdataに応じて、最後の10個以下をフェッチするために-min(len(data), 10):が使用されます。


より簡単に上記のサンプルを理解するために、ここでは単純なヘルパーコードは次のとおりです。

>>> data = [] 
>>> for i in range(0, 10): 
...  index = -min(len(data), 5) 
...  data += [i] 
...  print(i, index, data[index:]) 
... 
0 0 [0] 
1 -1 [1] 
2 -2 [1, 2] 
3 -3 [1, 2, 3] 
4 -4 [1, 2, 3, 4] 
5 -5 [1, 2, 3, 4, 5] 
6 -5 [2, 3, 4, 5, 6] 
7 -5 [3, 4, 5, 6, 7] 
8 -5 [4, 5, 6, 7, 8] 
9 -5 [5, 6, 7, 8, 9]