2017-06-29 8 views
0

今日私が期待していなかったPythonのリストの理解を使用してエラーが発生しました。単に基本的にエラーが何であるかを説明しPython: "numpy.amax" vs Pythonの "max": 'int'オブジェクトは反復不可

TypeError: 'int' object is not iterable, why it's happening

:私はこのポストをチェックします。私の質問はもう少し具体的です。なぜ、 'np.percentile'関数は動作するのですか? 'max'と 'min'ではありません。注:binnedMetricは入れ子リストの辞書です。つまり、binnedMetric ['key'] [num1-numBins] [listContainingItemsWithinBin]です。私は各ビンのすべてのアイテムについて統計を取っています。ここで働く私のコードからsnippitさ:

 tempAvgMetric = [[] for dmx in range(numBins)] 
    for idx in range(len(binnedMetric[expDir])): 
     for xxx in range(numBins): 
      tempAvgMetric[xxx].extend(binnedMetric[expDir][idx][nameNum][xxx]) 
    for idx in range(numBins): 
     if np.isnan(avgMetric[idx]): 
      tempAvgMetric[idx] = 0 

    percentile50 = np.array([np.percentile(tempAvgMetric[dmx], 50) for dmx in range(numBins) if tempAvgMetric]) 
    percentile75 = np.array([np.percentile(tempAvgMetric[dmx], 75) for dmx in range(numBins) if tempAvgMetric]) 
    percentile25 = np.array([np.percentile(tempAvgMetric[dmx], 25) for dmx in range(numBins) if tempAvgMetric]) 
    maximum =  np.array([np.amax(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 
    minimum =  np.array([np.amin(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 

をゼロに「ナン」を変換するには、正しく動作するためにパーセンタイル関数を取得する必要があるように思われます。

maximum =  np.array([max(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 
minimum =  np.array([min(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 

私のように定義されて、私は「DMX」を反復処理しています、min関数の繰り返し処理を行うわけではないので、私はそれが独特見つける:私はまた、次のようにPythonの「分」と「最大」の機能を使用してみましたリストの理解に反復可能です。私は、関数呼び出しが何かに影響を与えるとは思わないでしょう。上の "np.percentile"リストの解説に示されているように、ループはほぼ同じです。なぜこの行動が存在するのかについての手がかりがあれば、大いに感謝します。ありがとうございました!

**更新日: 機能コードです。それは、 "intオブジェクトはiterableではありません"エラーで動作します。単に「」

a = [[np.nan, np.nan],[1],[], [4,7,6,8,10],[13,12,0.2]] 

の値を変更

import numpy as np 
a = [[1,2,3],[1],[], [4,7,6,8,10],[13,12,0.2]] 
b = [[1,4,2],[1,6,7],[6,5,3],[1,4,3],[13,11,1]] 
c = [[1,2,3], [1,4,6], [1,4,6], [1], []] 
d = [[2],[4],[6],[8],[10]] 
binnedMetric = {'tempKey': [[a,b], [c,d]]} 
expDir = 'tempKey' 
numBins = 5 
nameNum = 0 

tempAvgMetric = [[] for dmx in range(numBins)] 
for idx in range(len(binnedMetric[expDir])): 
    for xxx in range(numBins): 
     tempAvgMetric[xxx].extend(binnedMetric[expDir][idx][nameNum][xxx]) 

avgMetric = np.array([np.mean(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 
varMetric = np.array([np.sqrt(np.var(tempAvgMetric[dmx])) for dmx in range(numBins) if tempAvgMetric]) 
for idx in range(numBins): 
    if np.isnan(avgMetric[idx]): 
     tempAvgMetric[idx] = 0 

percentile50 = np.array([np.percentile(tempAvgMetric[dmx], 50) for dmx in range(numBins) if tempAvgMetric]) 
percentile75 = np.array([np.percentile(tempAvgMetric[dmx], 75) for dmx in range(numBins) if tempAvgMetric]) 
percentile25 = np.array([np.percentile(tempAvgMetric[dmx], 25) for dmx in range(numBins) if tempAvgMetric]) 
maximum =  np.array([np.amax(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 
minimum =  np.array([np.amin(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 

maximum2 =  np.array([max(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 
minimum2 =  np.array([min(tempAvgMetric[dmx]) for dmx in range(numBins) if tempAvgMetric]) 

print(percentile50) 
print(maximum) 
print(maximum2) 

は、私はに実行したのと同じエラーを与えるが、唯一「maximum2」の、コードを壊します。

+0

サンプルデータと予想される結果がありますか? –

+0

申し訳ありませんが、いくつか編集しなければなりませんでした。 amaxとaminのコードでエラーが発生し始めました。上記の投稿をbinnedMetricのダミーリストで更新して実行します。 –

答えて

0

リストや他の反復可能

とは対照的に、いくつかの点で、あなたのコードは、整数に maxを適用しようとしています説明するために

:それは最初の配列に引数を回すため

In [354]: max(123) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-354-8de2de84b04d> in <module>() 
----> 1 max(123) 

TypeError: 'int' object is not iterable 
In [355]: np.max(123) 
Out[355]: 123 
In [356]: np.max(np.array(123)) 
Out[356]: 123 

np.maxで動作します。このコードで

tempAvgMetric = [[] for dmx in range(numBins)] 
.... 
     tempAvgMetric[xxx].extend(binnedMetric[expDir][idx][nameNum][xxx]) 
.... 
     tempAvgMetric[idx] = 0 

、一部tempAvgMetric要素がリスト(それら全てが[]として起動)であるが、idx場合について、それらは整数0です。その割り当てを変更する

tempAvgMetric[idx] = [0] 

In [357]: max([0]) 
Out[357]: 0 

max([])np.max([])の両方がエラーを生成することに注意してください。


if tempAvgMetric 

テストはあまり意味がありません。これはいつ偽でしょうか?リストが空の場合、すなわちnumBins==0の場合のみ

+0

ありがとうございます。誰もがそれを理解したように思える。魅力のように機能し、 "if tempAvgMetric"についてのあなたのコメントが掲載されました。私はtempAvgMetric内で空のリストをスキップしていないのはなぜだろうかと疑問に思っていましたが、 "tempAvgMetric [dmx]"なら、あなたはあなたが言及しているmax([])エラーを避けるでしょう。 –

0

あなたのtempAvgMetricリストの要素のいくつかはリストではなく整数です。最初に空リストのネストされたリストとしてtempAvgMetricを作成します。しかし、後に、第二の主要ループで、あなたは整数で(0)一部のリストを置き換える:

for idx in range(numBins): 
    if np.isnan(avgMetric[idx]):  
     tempAvgMetric[idx] = 0 
関連する問題