python(scipy)-- 设置数组元素时出现序列错误
我想写一个程序,计算从均匀随机数分布中取出的N个随机数的平均值。这个程序需要对N=10、100、1000、10000、100000和1000000这几个数量的随机数进行计算。然后,我还需要把平均值作为N的函数画出来。
我做了以下这些:
from scitools.std import *
import matplotlib.pyplot as plt
N=10
distribution=[]
for i in range(1,7):
N*=10
random_numbers=[random.uniform(0,1,size=N)]
distribution.append(random_numbers)
plt.semilogx(array(range(N)),array(distribution).mean())
plt.xlabel('N')
plt.grid(True)
plt.show()
但是在我绘图的那一行出现了标题中的错误。另外,如果有其他更符合Python风格的方法来实现这个,我会很感激。
谢谢。
3 个回答
0
看起来你是在把一个列表放到另一个列表里,像这样:
a = [[1], [2], [3]]
试试这个代码:
for i in range(1, 7):
N*=10
distribution.append(random.uniform(0,1,size=N))
@Raymond 建议对这个序列取平均值:
plt.semilogx(array(range(N)),array(sum(distribution) / float(len(distribution))))
1
在把随机数加到分布列表之前,先计算一下平均值(mean)。这样你就能得到一个简单的n个元素的列表图。问题在于,你需要的是一个标量的列表,而不是一个数组的列表:
distribution=[]
for i in range(1,7):
N*=10
random_numbers=[random.uniform(0,1,size=N)]
distribution.append(array(random_numbers).mean())
1
import scipy
import matplotlib.pyplot as plt
Ns=[10**i for i in range(1,7)]
means=[scipy.random.uniform(0,1,size=N).mean() for N in Ns]
plt.semilogx(Ns,means)
plt.xlabel('N')
plt.grid(True)
plt.show()
1. 如前所述,distribution
是一个数组的列表,里面的数组形状各不相同。你不能通过调用 np.array(distribution)
来把这样的对象变成一个 numpy 数组。
2. 至少在绘图时,你不需要保存整个分布。只需计算并保存均值就可以了。一个简洁的方法是使用 列表推导式。
3>在脚本中不要使用 from module import *
。这样会让你很难追踪变量的来源。from module import *
主要是为了在交互式会话中使用,但通常不推荐在脚本中使用。