我今天在使用Python的列表理解时遇到了一个我意想不到的错误。我查过这个帖子:
TypeError: 'int' object is not iterable, why it's happening
这基本上解释了错误是什么。不过,我的问题更具体一点。为什么百分位'函数可以工作,但不能使用'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])
将“nan”转换为零似乎是使百分位函数正常工作所必需的。我还尝试使用Python的“min”和“max”函数,如下所示:
^{pr2}$我发现它很奇怪,因为我没有迭代min函数,而是迭代'dmx',它在列表理解中被定义为iterable。我认为函数调用不会影响任何东西。如上所示百分位“列表理解,循环几乎完全相同。任何关于这种行为为何存在的线索都将不胜感激。谢谢您!在
**更新: 这是一个有效的代码。它可以工作,没有“int object is not 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”,给出与我遇到的相同错误。在
原因是您的
tempAvgMetric
列表中的某些元素不是列表,而是整数。最初,您将tempAvgMetric
构造为空列表的嵌套列表。但是,稍后,在第二个主循环中,您将一些列表替换为整数(0):在某个时刻,您的代码试图将
max
应用于整数,而不是列表或其他iterable举例说明:
^{pr2}$np.max
之所以起作用,是因为它首先将参数转换为数组。在使用这段代码,一些
tempAvgMetric
元素将是列表(它们都以[]
开头),但是对于idx
的情况,它们是整数0
。在将任务更改为:
请注意,}都会产生错误。在
max([])
和{测试没什么意义。什么时候会是假的?仅当列表为空时,即如果
numBins==0
。在相关问题 更多 >
编程相关推荐