For循环和'numpy.float64'对象不是iterab

2024-06-12 05:21:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的for循环来计算RMS(均方根),它在sigma求和表中定义:

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]

Tags: infor定义cl错误nprangesqrt
3条回答

复制您的计算,有点简单:

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

但我想知道你为什么要这么做。你希望平方一个Cl值的范围,然后求和?在多个范围内重复?

=====

有一条np.sum和一条Pythonsum。Pythonsum可以很好地处理数字列表,例如由列表理解生成的数字:

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

问题是用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))))

删除sumCl的每个元素都是浮点数,因此您不可能对它们调用sum:

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

如果要调用numpy的广播来执行电源操作,则不需要索引数组。

相关问题 更多 >