巨蟒:“;“numpy.amax”;vs Python';s";最大值:';int';对象是不可编辑的

巨蟒:“;“numpy.amax”;vs Python';s";最大值:';int';对象是不可编辑的,python,python-2.7,list,numpy,list-comprehension,Python,Python 2.7,List,Numpy,List Comprehension,我今天在使用Python的列表理解时遇到了一个错误,这是我没有预料到的。我查看了这篇帖子: 这基本上解释了错误是什么。不过,我的问题有点具体。为什么“np.percentile”函数有效,而“max”和“min”函数无效注意:binnedMetric是嵌套列表的字典,即binnedMetric['key'][num1 numBins][listcainingitemswithinbin]。我正在对每个箱子中的所有物品进行统计。以下是我的代码中有效的片段: tempAvgMetric

我今天在使用Python的列表理解时遇到了一个错误,这是我没有预料到的。我查看了这篇帖子:

这基本上解释了错误是什么。不过,我的问题有点具体。为什么“np.percentile”函数有效,而“max”和“min”函数无效注意:binnedMetric是嵌套列表的字典,即binnedMetric['key'][num1 numBins][listcainingitemswithinbin]。我正在对每个箱子中的所有物品进行统计。以下是我的代码中有效的片段:

     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”上迭代,它在列表中被定义为一个iterable。我认为函数调用不会影响任何事情。如上所示,在“np.percentile”列表理解中,循环几乎是相同的。任何关于这种行为存在原因的线索都将不胜感激。谢谢大家!

**更新: 这是一个运行代码。它可以工作,没有“int object is not iterable”错误

只需将“a”的值更改为

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

中断代码,但仅针对“maximum2”,给出与我遇到的相同错误。

原因是
tempAvgMetric
列表中的某些元素不是列表,而是整数。最初,您将
tempAvgMetric
构造为空列表的嵌套列表。但是,稍后在第二个主循环中,您将用整数(0)替换某些列表:


在某个时刻,您的代码试图将
max
应用于整数,而不是列表或其他iterable

举例说明:

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
使用此代码,一些
tempAvgMetric
元素将是列表(它们都以
[]
开头),但对于
idx
情况,它们是整数
0

将该任务更改为:

tempAvgMetric[idx] = [0]

In [357]: max([0])
Out[357]: 0
请注意,
max([])
np.max([])
都会产生错误



测试没有多大意义。这什么时候是假的?仅当列表为空时,即如果
numBins==0

获得了一些样本数据和预期结果?在numpySorry中,你不应该需要循环或列表理解,我必须编辑一些东西。我与amax和amin的代码开始抛出错误,我也不知道为什么。我会用binnedMetric的虚拟列表更新上面的帖子,这样它就会运行起来,谢谢。除了我,似乎每个人都明白了。你对“if tempAvgMetric”的评论恰到好处。我想知道为什么该检查没有跳过tempAvgMetric中的空列表,但行应该是:“如果tempAvgMetric[dmx]”,这样可以避免您提到的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
 tempAvgMetric = [[] for dmx in range(numBins)]
 ....
       tempAvgMetric[xxx].extend(binnedMetric[expDir][idx][nameNum][xxx])
 ....
        tempAvgMetric[idx] = 0
tempAvgMetric[idx] = [0]

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