python(scipy)-- 设置数组元素时出现序列错误

1 投票
3 回答
2629 浏览
提问于 2025-04-17 05:21

我想写一个程序,计算从均匀随机数分布中取出的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 * 主要是为了在交互式会话中使用,但通常不推荐在脚本中使用。

撰写回答