在嵌套循环中执行计算时出错,TypeError:“numpy.float64”对象不可迭代

llew8vvj  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(148)

我想计算sum of squared errors,我使用了一个嵌套循环。


的数据
我是Python新手,我很抱歉,但我遇到了错误:

File "...", line 13, in <module>
    for y in values_subtraction_mean:
TypeError: 'numpy.float64' object is not iterable

字符串
问题出在第二个循环中,当我必须在for y in values_subtraction_mean: result = sum(math.sqrt(y))中计算result时:
在第二个循环中,它应该显示values_subtraction_mean的所有值,所以它应该显示2.2, -0.8, 0.2, 1.2, -2.8。接下来,对于上面的每个值,应该计算sqrt并获得4.84, 0.64, 0.04, 1.44, 7.84。最后,您必须将所有这些数字相加并获得14.8
我做错了什么?

from numpy import mean
import math

values = [5, 2, 3, 4, 0]

mean = mean(values)

for x in values:
  values_subtraction_mean = x - mean
  print(values_subtraction_mean)
  #2.2, -0.8, 0.2, 1.2, -2.8

  for y in values_subtraction_mean:
    result = sum(math.sqrt(y))
    print(result)
    #sqrt: 4.84, 0.64, 0.04, 1.44, 7.84
    #sum and result: 14.8


我试着用这个,但它不能解决问题:

import numpy as np
values = np.array([5, 2, 3, 4, 0])


我试着不使用numpy,用sum(values) / len(values)计算平均值,但它也不起作用,我得到错误:
TypeError: 'float' object is not iterable

toe95027

toe950271#

values = [5, 2, 3, 4, 0]

# Calculate the mean of the values
mean_value = sum(values) / len(values)

# Initialize sum of squared errors
sse = 0

# Loop through the values and calculate the squared error for each
for x in values:
    error = x - mean_value
    squared_error = error ** 2
    sse += squared_error

print(f"Sum of Squared Errors: {sse}")

字符串

gmxoilav

gmxoilav2#

你不需要一个嵌套的for循环,而是需要两个空列表来存储值。
此外,你需要平方值,而不是平方根。

from numpy import mean
import math

values = [5, 2, 3, 4, 0]
values_subtraction_mean =[]  # empty list to store values
result= []                   # empty list to store values

mean = mean(values)

for x in values:
    values_subtraction_mean.append(x - mean)
    
    
print(values_subtraction_mean)

for y in values_subtraction_mean:
    result.append(y**2)
print(result)

total = sum(result)
print(total)

个字符

编辑:

Numpy版本没有forloops

import numpy as np
values = np.array([5, 2, 3, 4, 0])

mean_diff = values-np.mean(values)
#array([ 2.2, -0.8,  0.2,  1.2, -2.8])

sq_values = (values-np.mean(values))**2
#array([4.84, 0.64, 0.04, 1.44, 7.84])

total = sum(sq_values)
#14.8

ff29svar

ff29svar3#

您似乎在理解基本的python迭代方面存在问题,更不用说numpy了。

In [1]: import numpy as np
   ...: import math
   ...: 
   ...: values = [5, 2, 3, 4, 0]
   ...: 
   ...: mean = np.mean(values)
   ...: 
   ...: for x in values:
   ...:   values_subtraction_mean = x - mean
   ...:   print(values_subtraction_mean)
   ...: 
   ...:   for y in values_subtraction_mean:
   ...:     result = sum(math.sqrt(y))
   ...:     print(result)
   ...: 
2.2
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[1], line 12
      9 values_subtraction_mean = x - mean
     10 print(values_subtraction_mean)
---> 12 for y in values_subtraction_mean:
     13   result = sum(math.sqrt(y))
     14   print(result)

TypeError: 'numpy.float64' object is not iterable

字符串
所以错误在for y in values...:行中。for x in values:工作,因为values是一个列表。在该循环中,它计算mean(使用numpy mean函数):

In [2]: mean
Out[2]: 2.8

In [3]: type(mean)
Out[3]: numpy.float64

In [4]: values_subtraction_mean
Out[4]: 2.2

In [5]: x
Out[5]: 5


你从列表中的一个元素中减去了平均值,然后试图对该值进行累加。y循环嵌套在x循环中。另外,x循环没有累加任何x-mean值。
下面的行也会有问题

sum(math.sqrt(y))


math函数只能处理标量,不能处理列表或数组。但是python sum需要一个可迭代的对象(例如列表)。所以我不太明白你在这里的意图。

修正迭代- sort of

在列表中添加结果的标准方法是将结果追加到列表中。更改代码:

In [9]: values = [5, 2, 3, 4, 0]
   ...: 
   ...: mean = np.mean(values)
   ...: values_sublist = []
   ...: for x in values:
   ...:   values_sublist.append(x - mean)
   ...: print(values_sublist)
   ...: result = []
   ...: for y in values_sublist:
   ...:     result.append(math.sqrt(y))
   ...: print(result)
[2.2, -0.7999999999999998, 0.20000000000000018, 1.2000000000000002, -2.8]
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[9], line 10
      8 result = []
      9 for y in values_sublist:
---> 10     result.append(math.sqrt(y))
     11 print(result)

ValueError: math domain error


values_sublist是所有列表值减去它们的平均值。所以y循环可以工作。但是它遇到了另一个问题-它不能接受负数的sqrt!

numpy版本

In [10]: values
Out[10]: [5, 2, 3, 4, 0]

In [11]: mean=np.mean(values)

In [12]: mean
Out[12]: 2.8

In [13]: np.array(values)-mean
Out[13]: array([ 2.2, -0.8,  0.2,  1.2, -2.8])

In [14]: np.sqrt(np.array(values)-mean)
C:\Users\14256\AppData\Local\Temp\ipykernel_8020\509743582.py:1: RuntimeWarning: invalid value encountered in sqrt
  np.sqrt(np.array(values)-mean)
Out[14]: array([1.4832397 ,        nan, 0.4472136 , 1.09544512,        nan])


如果values是一个numpy数组,那么可以在没有python循环的情况下完成此操作。现在负值会产生一个nan值和一个警告。没有必要在nan数组上执行sum

复杂值

我们可以通过将值设置为complex dtype数组来处理sqrt问题:

In [15]: values_c = np.array(values,complex); values_c
Out[15]: array([5.+0.j, 2.+0.j, 3.+0.j, 4.+0.j, 0.+0.j])

In [16]: np.mean(values_c)
Out[16]: (2.8000000000000003+0j)

In [17]: values_c - np.mean(values_c)
Out[17]: array([ 2.2+0.j, -0.8+0.j,  0.2+0.j,  1.2+0.j, -2.8+0.j])

In [18]: np.sqrt(values_c - np.mean(values_c))
Out[18]: 
array([1.4832397 +0.j        , 0.        +0.89442719j,
       0.4472136 +0.j        , 1.09544512+0.j        ,
       0.        +1.67332005j])

In [19]: np.sum(_)
Out[19]: (3.0258984079294224+2.5677472440680673j)


不过,我不确定这是你需要的。

square而不是sqrt

但是等等,你想要的“sqrt”值实际上是平方值,而不是平方根。

In [20]: values = [5, 2, 3, 4, 0]
    ...: mean = np.mean(values)
    ...: values_sublist = []
    ...: for x in values:
    ...:   values_sublist.append(x - mean)
    ...: print(values_sublist)
    ...: result = []
    ...: for y in values_sublist:
    ...:     result.append(y**2)
    ...: print(result); print(sum(result))
[2.2, -0.7999999999999998, 0.20000000000000018, 1.2000000000000002, -2.8]
[4.840000000000001, 0.6399999999999997, 0.04000000000000007, 1.4400000000000004, 7.839999999999999]
14.8


现在你的两个循环工作得很好。
并写成一个numpy表达式:

In [21]: np.sum((np.array(values)-np.mean(values))**2)
Out[21]: 14.8


我们也可以使用列表解析来代替for循环--尽管我们仍然需要使用np.mean,或者一个等价的循环。所以它不是一个纯粹的列表计算:

In [22]: values
Out[22]: [5, 2, 3, 4, 0]

In [23]: mean
Out[23]: 2.8

In [24]: sum((x-mean)**2 for x in values)
Out[24]: 14.8


sqrt和复杂的代码可能会分散注意力,但我会留下它,因为我认为它可能是有指导意义的,它是调试代码的一部分。

相关问题