我想绘制一个近似的数字" 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的新手,所以请考虑我的简单要求。我真的被困在这里,似乎无法自己解决这个问题。
非常感谢您的帮助。
答案 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)
给我这个情节
答案 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))
一个小小的注释,命名一个不返回pi
的函数true pi
对我来说似乎有点棘手。