python从迭代返回数组

时间:2014-05-01 11:12:32

标签: python function matplotlib iterator

我想绘制一个近似的数字" pi"它是由两个均匀分布的随机变量的函数产生的。目标是表明,通过更高的样本绘制,函数值接近" pi"。

这是我的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的值。

我的第一次尝试是:

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

我的猜测是启动迭代器:

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 个答案:

答案 0 :(得分:2)

你可以试试这个

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

pipl(100)

给我这个情节

enter image description here

答案 1 :(得分:2)

如果您希望继续使用可迭代方法,可以使用Numpy的fromiter()将结果收集到数组中。像:

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对我来说似乎有点棘手。