我正在尝试编写一些代码来计算均值,方差,标准差,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
答案 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")))
。
我敢肯定,您实际上并不想在此行上调用varience
和mean
,只需引用它们即可。因此,也请将该行更改为make_gauss(sigma=varience, mu=mean, x = random.uniform((float("inf"))*-1, float("inf")))