2014-05-01 65 views
1

我想绘制由两个均匀分布的随机变量的函数生成的数字“pi”的近似值。我们的目标是证明在更高的样本绘制下函数值接近“pi”。python从迭代中返回数组

这里是我的PI功能:

def pi(n): 
    x = rnd.uniform(low = -1, high = 1, size = n) #n = size of draw 
    y = rnd.uniform(low = -1, high = 1, size = n) 
    a = x**2 + y**2 <= 1  #1 if rand. draw is inside the unit cirlce, else 0 
    ac = np.count_nonzero(a) #count 1's 
    af = np.float(ac)   #create float for precision 
    pi = (af/n)*4    #compute p dependent on size of draw 
    return pi 

我的问题:

我希望创建一个地块从PI依赖于n个值()一lineplot。

我的拳头尝试是:

def pipl(n): 
    for i in np.arange(1,n): 
     plt.plot(np.arange(1,n), pi(i)) 
     print plt.show() 

pipl(100) 

返回:

ValueError: x and y must have same first dimension 

我seocond猜测是启动一个迭代器:

def y(n): 
    n = np.arange(1,n) 
    for i in n: 
     y = pi(i) 
     print y 

y(1000) 

导致:

3.13165829146 
3.16064257028 
3.06519558676 
3.19839679359 
3.13913913914 

所以算法并不遥远,但我需要输出作为matplotlib可以读取的数据类型。

我读:

http://docs.scipy.org/doc/numpy/reference/routines.array-creation.html#routines-array-creation 

,并试图汤姆实现的功能等:

... 
y = np.array(pi(i)) 
... 

... 
y = pi(i) 
y = np.array(y) 
... 

和所有可从网站等功能。但是,我似乎无法将我的迭代y值放入matplotlib可以读取的值中。

我对Python很新,所以请体谅我的简单请求。我真的被困在这里,似乎无法自己解决这个问题。

您的帮助真的很感谢。

回答

2

你可以用这个

def pipl(n): 
    plt.plot(np.arange(1,n), [pi(i) for i in np.arange(1,n)]) 
    print plt.show() 

pipl(100) 

如果你想留在你的迭代方法,您可以使用与NumPy的fromiter()收集的结果,一个是给我这个情节

enter image description here

+0

太好了,非常感谢。 – Vincent

2

尝试阵列。像:

def pipl(n): 
    for i in np.arange(1,n): 
     yield pi(i) 

n = 100 

plt.plot(np.arange(1,n), np.fromiter(pipl(n), dtype='f32')) 

但我认为与NumPy的vectorize甚至会更好,在这种情况下,它使得生成的代码更具有可读性(对我来说)。通过这种方法,您不再需要pipl功能。

# vectorize the function pi 
pi_vec = np.vectorize(pi) 

# define all n's 
n = np.arange(1,101) 

# and plot 
plt.plot(n, pi_vec(n)) 

enter image description here

一个小侧面说明,将函数命名为pi不返回true pi似乎有点棘手给我。

+0

谢谢,矢量化是我一直在寻找的东西。 – Vincent