用Mean()除以零?

时间:2019-06-06 19:46:25

标签: python-3.x

我正在尝试编写一些代码来计算均值,方差,标准差,FWHM,并最终评估高斯积分。我一直无法解决的零误差除法问题,我想知道解决方案吗?

在抛出错误的地方,我试图按如下方式抛出异常处理程序

Average = (sum(yvalues)) / (len(yvalues)) try: return (sum(yvalues) / len(yvalues))
expect ZeroDivisionError:
  return 0
xvalues = []
yvalues = []

def generate():
    for i in range(0,300):
        a = rand.uniform((float("-inf") , float("inf")))
        b = rand.uniform((float("-inf") , float("inf")))
        xvalues.append(i)

        ### Defining the variable 'y'  
        y = a * (b + i)

        yvalues.append(y) + 1



def mean():
    Average = (sum(yvalues))/(len(yvalues))
    print("The average is", Average)
    return Average
def varience():
    # This calculates the SD and the varience
    s =  []  
    for i in yvalues:
        z = i - mean()
        z = (np.abs(i-z))**2
        s.append(y)**2
    t = mean()
    v = numpy.sqrt(t)
    print("Answer for Varience is:", v)
    return v
Traceback (most recent call last):
  File "Tuesday.py", line 42, in <module>
    def make_gauss(sigma=varience(), mu=mean(), x = random.uniform((float("inf"))*-1, float("inf"))):
  File "Tuesday.py", line 35, in varience
    t = mean()
  File "Tuesday.py", line 25, in mean
    Average = (sum(yvalues))/(len(yvalues))
ZeroDivisionError: division by zero

2 个答案:

答案 0 :(得分:1)

有些事情与上面提到的人不太正确。

import random
import numpy as np

def generate():
    xvalues, yvalues = [], []

    for i in range(0,300):
        a = random.uniform(-1000, 1000)
        b = random.uniform(-1000, 1000)
        xvalues.append(i)

        ### Defining the variable 'y'  
        y = a * (b + i)

        yvalues.append(y)

    return xvalues, yvalues

def mean(yvalues):
    return sum(yvalues)/len(yvalues)

def variance(yvalues):
    # This calculates the SD and the varience
    s =  []

    yvalues_mean = mean(yvalues)

    for y in yvalues:
        z = (y - yvalues_mean)**2
        s.append(z)
    t = mean(s)
    return t

def variance2(yvalues):
    yvalues_mean = mean(yvalues)
    return sum( (y-yvalues_mean)**2 for y in yvalues) / len(yvalues)

# Generate the xvalues and yvalues
xvalues, yvalues = generate()

# Now do the calculation, based on the passed parameters
mean_yvalues = mean(yvalues)
variance_yvalues = variance(yvalues)
variance_yvalues2 = variance2(yvalues)

print('Mean {}  variance {} {}'.format(mean_yvalues, variance_yvalues, variance_yvalues2))

# Using Numpy

np_mean = np.mean(yvalues)
np_var = np.var(yvalues)

print('Numpy: Mean {}  variance {}'.format(np_mean, np_var))

方差的计算方法不太正确,但是鉴于“ SD和方差”的注释,您可能要同时计算两者。

上面的代码提供了2种(嗯,有3种)方法来执行我理解的尝试,但是我更改了一些方法来对其进行清理。 generate()现在返回两个列表。 mean()返回平均值,等等。函数variance2()提供了另一种计算方差的方法,但使用了列表理解样式。

最后两行是使用numpy的示例,它内置了所有功能,如果可以的话,也是一种不错的选择。

一个不清楚的部分是random.uniform(float("-inf"), float("inf"))),这似乎是一个错误(?)。

答案 1 :(得分:0)

您先致电mean,然后再致电generate

这很明显,因为yvalues.append(y) + 1返回generate并且您无法添加,TypeError(在.append中)会引起另一个错误(None) 1到None

yvalues.append(y) + 1更改为yvalues.append(y + 1),然后确保在致电generate之前先致电mean

还要注意,varience中存在相同的错误(应该称为variance,顺便说一句)。 s.append(y)**2应该是s.append(y ** 2)

您遇到的另一个错误是stacktrace显示make_gauss(sigma=varience(), mu=mean(), x = random.uniform((float("inf"))*-1, float("inf")))

我敢肯定,您实际上并不想在此行上调用variencemean,只需引用它们即可。因此,也请将该行更改为make_gauss(sigma=varience, mu=mean, x = random.uniform((float("inf"))*-1, float("inf")))