我要做的是制作高斯函数图。然后在空格中的任何地方选择随机数,例如y = [0,1](因为它是标准化的)& X = [0200]。然后,我希望它忽略曲线上方的所有值,只保留它下面的值。
import numpy
import random
import math
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
from math import sqrt
from numpy import zeros
from numpy import numarray
variance = input("Input variance of the star:")
mean = input("Input mean of the star:")
x=numpy.linspace(0,200,1000)
sigma = sqrt(variance)
z = max(mlab.normpdf(x,mean,sigma))
foo = (mlab.normpdf(x,mean,sigma))/z
plt.plot(x,foo)
zing = random.random()
random = random.uniform(0,200)
import random
def method2(size):
ret = set()
while len(ret) < size:
ret.add((random.random(), random.uniform(0,200)))
return ret
size = input("Input number of simulations:")
foos = set(foo)
xx = set(x)
method = method2(size)
def undercurve(xx,foos,method):
Upper = numpy.where(foos<(method))
Lower = numpy.where(foos[Upper]>(method[Upper]))
return (xx[Upper])[Lower],(foos[Upper])[Lower]
当我尝试打印undercurve时,我收到错误:
TypeError: 'set' object has no attribute '__getitem__'
我不知道如何解决它。
大家都知道,我对python和编程都很陌生,但是对于任何帮助都表示赞赏,如果有任何问题,我会尽力回答。
答案 0 :(得分:2)
您的代码难以阅读..无论如何,您无法使用[]
访问某个集,即foos[Upper]
,method[Upper]
等都是非法的。我不明白为什么要将foo
,x
转换成套装。此外,对于由method2
生成的点,例如(x0,y0),x
中很可能不存在x0。
我不熟悉numpy,但这就是我为你指定的目的所做的事情:
def undercurve(size):
result = []
for i in xrange(size):
x = random()
y = random()
if y < scipy.stats.norm(0, 200).pdf(x): # here's the 'undercurve'
result.append((x, y))
return results
答案 1 :(得分:2)
你所看到的错误的直接原因可能是这一行(应该通过完整的追溯来识别 - 发布它通常很有帮助):
Lower = numpy.where(foos[Upper]>(method[Upper]))
因为容易混淆的变量method
实际上是set
,由函数method2
返回。实际上,第二个想法,foos
也是set
,所以它可能首先失败了。集合不支持使用the_set[index]
之类的索引进行索引;关于__getitem__
的投诉意味着什么。
我不完全确定代码的所有部分是什么意思;像“foos”这样的变量名称实际上并没有那样的帮助。所以这就是我如何做你想做的事情:
# generate sample points
num_pts = 500
sample_xs = np.random.uniform(0, 200, size=num_pts)
sample_ys = np.random.uniform(0, 1, size=num_pts)
# define distribution
mean = 50
sigma = 10
# figure out "normalized" pdf vals at sample points
max_pdf = mlab.normpdf(mean, mean, sigma)
sample_pdf_vals = mlab.normpdf(sample_xs, mean, sigma) / max_pdf
# which ones are under the curve?
under_curve = sample_ys < sample_pdf_vals
# get pdf vals to plot
x = np.linspace(0, 200, 1000)
pdf_vals = mlab.normpdf(x, mean, sigma) / max_pdf
# plot the samples and the curve
colors = np.array(['cyan' if b else 'red' for b in under_curve])
scatter(sample_xs, sample_ys, c=colors)
plot(x, pdf_vals)
当然,您还应该意识到,如果您只想要曲线下的点,这相当于(但效率低得多)仅从正态分布中采样,然后为每个点随机选择y
从0到pdf值均匀采样:
sample_xs = np.random.normal(mean, sigma, size=num_pts)
max_pdf = mlab.normpdf(mean, mean, sigma)
sample_pdf_vals = mlab.normpdf(sample_xs, mean, sigma) / max_pdf
sample_ys = np.array([np.random.uniform(0, pdf_val) for pdf_val in sample_pdf_vals])