我今天使用Python的List理解遇到了一个错误,我没想到。我查了这篇文章:
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])
将'nan'转换为零似乎是使百分位函数正常工作所必需的。我也尝试使用Python的'min'和'max'函数,如下所示:
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])
我觉得它很奇怪,因为我没有迭代min函数,我正在迭代'dmx',它被定义为列表理解中的一个可迭代。我不认为函数调用会影响任何东西。如上面“np.percentile”列表推导中所示,循环几乎相同。关于为什么存在这种行为的任何线索将不胜感激。谢谢!
**更新: 这是一个功能正常的代码。它工作,没有“int object is iterable”错误。
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 :(得分:0)
原因是tempAvgMetric
列表中的某些元素不是列表而是整数。最初,您将tempAvgMetric
构造为空列表的嵌套列表。但是,稍后,在第二个主循环中,使用整数(0)替换某些列表:
for idx in range(numBins):
if np.isnan(avgMetric[idx]):
tempAvgMetric[idx] = 0
答案 1 :(得分: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
。