[英]Beginners python, easy function
制作函数gaussian(x,m = 0,s = 1)以计算高斯函数。 为[m-5s,m + 5s]中n个均匀间隔的x值写出格式合理的x和f(x)值表。 (根据需要选择s,m,n)
这是我到目前为止所做的:
from math import *
from numpy import linspace
def gaussian(x, m=0, s=1):
fx=(1/((sqrt(2*pi))*s)*exp(-0.5*(((x - m)/s))**2))
return fx
我想使变量s和m为全局变量,
xmin=m-5s
xmax=m+5s
x=linspace(xmin, xmax, 10)
然后从for循环调用函数,在该循环中我遍历x
我的第一个尝试是尝试函数内的所有内容,但我的导师说,在函数外定义x是一个更好的主意。 如果s和m仅存在于函数内部,那么如何找到它们-还是应该以另一种方式进行处理? 非常感谢您的帮助,请记住,我已经学习了几个星期。
这个怎么样:
from numpy import linspace
from math import *
def gaussian(x, m, s):
fx=(1/((sqrt(2*pi))*s)*exp(-0.5*(((x - m)/s))**2))
return fx
m = 0
s = 1
xmin = m-5*s
xmax = m+5*s
x = linspace(xmin, xmax, 10)
for val in x:
print "f(",val,") = ",gaussian(val,m,s)
使用NumPy将其向量化,避免循环:
import numpy as np
def gaussian(x, m, s):
fx = (1/((np.sqrt(2*np.pi))*s)*np.exp(-0.5*(((x - m)/s))**2))
return fx
m=0; s=1
x = np.linspace(m-5*s, m+5*s, num=100)
print(gaussian(x))
[ 1.48671951e-06 2.45106104e-06 3.99989037e-06 6.46116639e-06
1.03310066e-05 1.63509589e-05 2.56160812e-05 3.97238224e-05
6.09759040e-05 9.26476353e-05 1.39341123e-04 2.07440309e-04
3.05686225e-04 4.45889725e-04 6.43795498e-04 9.20104770e-04
1.30165384e-03 1.82273110e-03 2.52649578e-03 3.46643792e-03
4.70779076e-03 6.32877643e-03 8.42153448e-03 1.10925548e-02
1.44624148e-02 1.86646099e-02 2.38432745e-02 3.01496139e-02
3.77369231e-02 4.67541424e-02 5.73380051e-02 6.96039584e-02
8.36361772e-02 9.94771388e-02 1.17117360e-01 1.36486009e-01
1.57443188e-01 1.79774665e-01 2.03189836e-01 2.27323506e-01
2.51741947e-01 2.75953371e-01 2.99422683e-01 3.21590023e-01
3.41892294e-01 3.59786558e-01 3.74773979e-01 3.86422853e-01
3.94389234e-01 3.98433802e-01 3.98433802e-01 3.94389234e-01
3.86422853e-01 3.74773979e-01 3.59786558e-01 3.41892294e-01
3.21590023e-01 2.99422683e-01 2.75953371e-01 2.51741947e-01
2.27323506e-01 2.03189836e-01 1.79774665e-01 1.57443188e-01
1.36486009e-01 1.17117360e-01 9.94771388e-02 8.36361772e-02
6.96039584e-02 5.73380051e-02 4.67541424e-02 3.77369231e-02
3.01496139e-02 2.38432745e-02 1.86646099e-02 1.44624148e-02
1.10925548e-02 8.42153448e-03 6.32877643e-03 4.70779076e-03
3.46643792e-03 2.52649578e-03 1.82273110e-03 1.30165384e-03
9.20104770e-04 6.43795498e-04 4.45889725e-04 3.05686225e-04
2.07440309e-04 1.39341123e-04 9.26476353e-05 6.09759040e-05
3.97238224e-05 2.56160812e-05 1.63509589e-05 1.03310066e-05
6.46116639e-06 3.99989037e-06 2.45106104e-06 1.48671951e-06]
对于表:
import pandas as pd
pd.DataFrame({'x' : x, 'gauss' : gaussian(x)})
至于你的评论:
我的导师说,在函数外定义x是一个更好的主意。 如果s和m仅存在于函数内部,那么如何找到它们-还是应该以另一种方式进行处理?
这主要取决于您是否希望x
是m
和s
的函数。 如果总是这样,那么应该将x
合并到函数中(在函数主体中本地定义x
):
def gaussian(m, s, num):
x = np.linspace(m-5*s, m+5*s, num=num)
fx = (1/((np.sqrt(2*np.pi))*s)*np.exp(-0.5*(((x - m)/s))**2))
return fx
无论哪种方式都不需要在这里处理global
,除非您有充分的理由,否则您可能应该避免这种情况。
在上gaussian
第一个定义中,事物的设置方式是将x
, m
和s
视为自变量。 也就是说,您可以指定其他不依赖于m
或s
x
。 如果希望x
始终是m
和s
的函数,则可以将x
直接合并到函数中,而不必在函数外部指定它。
我将尝试复制我认为您想要的。 Python确实有一个global
关键字,但是我不确定这就是您所需要的( 这里是有关何时需要使用globals的很好的解释)。
from numpy import linspace, sqrt, pi, exp
def gaussian(x, m=0, s=1):
fx=(1/((sqrt(2*pi))*s)*exp(-0.5*(((x - m)/s))**2))
return fx
#we must define m and s in order to calculate our bounds for linspace
m = 5
s = 1
#you must have a '*' with multiplication. 5s is not equivelent to 5*s
xmin = m - 5 * s
xmax = m + 5 * s
x = linspace(xmin, xmax, 10)
#apply your gaussian to every value in x
fx = [gaussian(a, m=m, s=s) for a in x]
print(fx)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.