我有一个简单的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]
答案 0 :(得分:1)
删除sum
,Cl
的每个元素都是浮点数,因此您无法对它们进行求和:
>>> sum(2.4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'float' object is not iterable
如果您打算调用numpy的广播来执行电源操作,那么您就不需要为该数组编制索引。
答案 1 :(得分:1)
问题是您使用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))))
答案 2 :(得分: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