0

我想做的是制作一个高斯函数图。然后在空间中的任意位置选择随机数,例如 y=[0,1](因为它是标准化的)& x=[0,200]。然后,我希望它忽略曲线上方的所有值,只保留曲线下方的值。

   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]

当我尝试打印欠曲线时,出现错误:

    TypeError: 'set' object has no attribute '__getitem__'

我不知道如何解决它。

正如你们所看到的,我在 python 和编程方面还是很新的,但是任何帮助都非常感谢,如果有任何问题,我会尽力回答。

4

2 回答 2

3

您看到的错误的直接原因可能是这一行(应该通过完整的回溯来识别——发布它通常很有帮助):

Lower = numpy.where(foos[Upper]>(method[Upper]))

因为名称混淆的变量method实际上是 a set,由您的函数返回method2。实际上,再想一想,foos也是 a 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])
于 2013-01-29T02:57:33.227 回答
2

很难阅读您的代码。无论如何,您无法使用 访问集合[],即foos[Upper],method[Upper]等都是非法的。我不明白你为什么将foo,转换x为 set. 此外,对于由 产生的点method2,例如 (x0, y0),x0 很可能不存在于 中x

我不熟悉 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
于 2013-01-29T02:53:10.903 回答