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実際にはです。実際、考え直してみると、もそうなので、おそらく最初は失敗しているでしょう。セットは、;のようなインデックス付けをサポートしていません。それはについての不満が意味するものです。setmethod2foossetthe_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。さらに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 に答える