Python:“numpy.amax”与 Python 的“max”:“int”对象不可迭代

Posted

技术标签:

【中文标题】Python:“numpy.amax”与 Python 的“max”:“int”对象不可迭代【英文标题】:Python: "numpy.amax" vs Python's "max" : 'int' object is not iterable 【发布时间】:2017-12-03 11:46:30 【问题描述】:

我今天在使用 Python 的列表推导时遇到了一个我没有预料到的错误。我检查了这篇文章:

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])

似乎需要将“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 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”,给出了与我遇到的相同的错误。

【问题讨论】:

得到了一些样本数据和预期结果?你不应该需要 numpy 的循环或列表理解 抱歉,我不得不编辑一些东西。我的带有 amax 和 amin 的代码开始抛出错误,我也不知道为什么。我将使用 binnedMetric 的虚拟列表更新上述帖子,以便它运行 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

在某些时候,您的代码会尝试将 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

【讨论】:

谢谢。似乎每个人都想通了,但我除外。就像一个魅力,你对“如果 tempAvgMetric”的评论是正确的。我想知道为什么该检查没有跳过 tempAvgMetric 中的空列表,但该行应该是:“if tempAvgMetric[dmx]”,这样可以避免您提到的 max([]) 错误。

以上是关于Python:“numpy.amax”与 Python 的“max”:“int”对象不可迭代的主要内容,如果未能解决你的问题,请参考以下文章

NumPy统计函数

14numpy——统计函数

Python机器学习(四十五)NumPy 统计函数

如何在numpy中找到每行中最大的索引,行的串联?

python3.3不自带的模块或工具包 下载以后要怎么处理才能在开发环境中调用 (比如放到pyth

AAX与Pyth Network合作提供实时加密数据