2017-06-29 116 views
0

我今天碰到一個錯誤,使用Python的List理解,我沒有料到。我查了一下這個帖子: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]。我正在統計每個垃圾箱中的所有物品。下面是從我的代碼,其工作方式的這段:

 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」,其定義爲:我使用Python的「最小值」和「最大值」的功能如下也嘗試在列表理解中可迭代。我不認爲函數調用會影響任何東西。如上面在「np.percentile」列表解析中所示,循環幾乎相同。任何線索,爲什麼這種行爲存在將不勝感激。謝謝!

**更新: 這是一個功能代碼。它工作,沒有「int對象不可迭代」的錯誤。

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) 

簡單地改變的值「a」到

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

斷碼,但僅限於「maximum2」,讓我也陷入了同樣的錯誤。

+0

有一些樣本數據和預期結果?你不應該需要循環或與numpy列表解析 –

+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中的空列表,但是該行應該是:「if tempAvgMetric [dmx]」,這樣可以避免你提到的最大([])錯誤。 –

0

原因是您的tempAvgMetric列表中的某些元素不是列表,而是整數。最初,您將構建tempAvgMetric作爲空列表的嵌套列表。不過,後來,在第二主迴路,你整數替換一些列表(0):

for idx in range(numBins): 
    if np.isnan(avgMetric[idx]):  
     tempAvgMetric[idx] = 0 
相關問題