【问题标题】:For loop and 'numpy.float64' object is not iterable errorFor循环和'numpy.float64'对象不是可迭代的错误
【发布时间】:2017-05-14 16:00:28
【问题描述】:

我有一个简单的 for 循环来计算以 sigma 求和形式定义的 RMS(均方根):

for i in range(int(N-(n*periyot/delta)), N+1):
    sum = np.sqrt((1 / N) * (sum((Cl[i]**2))))

然后我得到了这个错误:

TypeError: 'numpy.float64' object is not iterable

以下是关于我的定义的一些信息:

N=40000, n=10.0, periyot=6.451290, delta=0.005  

Cl=[-21.91969   -12.452671   -7.928303  ...,  -0.0833991  -0.0579686
  -0.0823822]

【问题讨论】:

  • 请显示完整的错误信息,包括告诉哪里错误发生的信息。
  • 文件 "/home/emre/Documents/LiClipse Workspace/fe_over_f0/fe_f0_08.py",第 70 行,在 中 sum = np.sqrt((1 / N) * (sum(( Cl[i]**2)))) TypeError: 'numpy.float64' object is not iterable
  • 看来您只是在寻找np.average(Cl[n1:n2]**2),其中n1 = int(N-(n*periyot/delta))n2 = N+1
  • @VBB 我会尝试并通知你,谢谢。
  • @ordinary 告诉我,如果你愿意,我可以将其作为答案发布。

标签: python python-3.x numpy for-loop


【解决方案1】:

复制你的计算,有点简化:

In [1]: Cl = np.array([-21.91969  , -12.452671 ,  -7.928303 ,  -0.0833991,-0.0579686,-0.0823822])

要在循环中计算和,初始化一个值,并在每次迭代时添加:

In [2]: res = 0
In [3]: for i in range(len(Cl)):
   ...:    res += np.sqrt((1/3)*Cl[i]**2)
   ...:    
In [4]: res
Out[4]: 24.551481812296061

numpy 计算一切(略有不同)

In [5]: np.sqrt((1/3)*Cl**2).sum()
Out[5]: 24.551481812296064

您的范围有点复杂,但我认为可以满足:

s, e = int(N-(n*periyot/delta)), N+1  # start, end of range

for i in range(s, e): ....

np.sqrt((1/N) * Cl[s:e]**2).sum()

但我想知道你为什么从 sum((Cl[i]**2))) 开始。您希望在哪里对一系列 Cl 值求平方然后求和?并为多个范围重复此操作?

=============

有一个 np.sum 和一个 Python sum。 Python sum 可以很好地处理数字列表,例如由列表推导生成的数字:

In [6]: [np.sqrt((1/3)*Cl[i]**2) for i in range(len(Cl))]
Out[6]: 
[12.655338922053147,
 7.1895529539798462,
 4.5774078712669173,
 0.048150492835172518,
 0.03346818681454574,
 0.047563385346433583]

In [7]: sum([np.sqrt((1/3)*Cl[i]**2) for i in range(len(Cl))])
Out[7]: 24.551481812296061

尝试将sum 应用于单个值导致的错误:

In [9]: sum(Cl[0])
....
TypeError: 'numpy.float64' object is not iterable
In [10]: sum(12.234)
...
TypeError: 'float' object is not iterable

In [11]: sum(Cl[:3])     # sum of several items
Out[11]: -42.300663999999998

===========

 RMS = ( (1 / N ) * (Cl[1]^2 + Cl[2]^2 + Cl[3]^2 + ... Cl[N]^2) ) ^0.5

表示,列表为:

 rms = (1/n) * math.sqrt(sum([Cl[1]**2, Cl[2]**2, ....]))
 rms = (1/n) * math.sqrt(sum([Cl[i]**2 for i in range(len(Cl))]))
 rms = (1/n) * math.sqrt(sum([c**2 for c in Cl]))   # iterate on Cl directly
 rms = (1/n) * np.sqrt(np.sum(Cl**2))     # for array Cl

【讨论】:

  • 非常感谢您的帮助。我想简单地计算 RMS。 RMS = ( (1 / N ) * (Cl[1]^2 + Cl[2]^2 + Cl[3]^2 + ... Cl[N]^2) ) ^0.5 我认为 sum() 必须适用于所有数字。我的意思是Python必须有这种东西。我感到非常失望总和不适用于我的数字(例如 -12.452671)
  • 我添加了一个使用 Python sum 函数和列表解析的示例。您的错误是尝试将 sum 应用于单个数字而不是列表或数组的结果。 Cl[i] 是单个值,而不是值范围。
【解决方案2】:

问题是你用sum 变量覆盖了sum 函数。试试这样的:

my_sum = 0
for i in range(int(N-(n*periyot/delta)), N+1):
    my_sum += np.sqrt((1 / N) * (sum((Cl[i]**2))))

【讨论】:

  • 这是另一个问题,sum(numpy.float64) 是第一个。
  • 谢谢。我改变了你说的代码: for i in range(int(N-(n*periyot/delta)), N+1): rms_Cl_sum = 0 rms_Cl_sum += np.sqrt((1 / N) * (sum( (Cl[i]**2)))) 但不幸的是我得到了同样的错误。 'numpy.float64' 对象不可迭代
【解决方案3】:

删除sumCl 的每个元素都是一个浮点数,所以你不可能对它们调用 sum:

>>> sum(2.4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'float' object is not iterable

如果你打算调用numpy的广播来执行power操作那么你不需要索引数组。

【讨论】:

  • 但我需要对 Cl 的所有元素求和。必须有另一种方法来对它们求和。
  • @ordinary 那么你需要一个不同的逻辑。您正在迭代每个元素并在每次迭代中丢弃 sum
  • 即使您确实修复了错误 @ordinary ,如果您仍然使用内置函数 sum 您将在第二次迭代期间面临另一个异常,因为 sum 将重新绑定到浮点数.为求和使用不同的名称,即my_sum,而不是sum
猜你喜欢
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多