2011-04-12 13 views
2

执行此操作的最佳(最快)方法是什么?用于快速计算Numpy中大数集标准偏差的方法

question

这会产生什么,我相信这是正确的答案,但显然在N = 10E6是痛苦的缓慢。我认为我需要保持Xi值,以便我可以正确计算标准偏差,但是有没有什么技术可以让这个运行更快?

def randomInterval(a,b): 
    r = ((b-a)*float(random.random(1)) + a) 
    return r 

N = 10e6 
Sum = 0 
x = [] 
for sample in range(0,int(N)): 
    n = randomInterval(-5.,5.) 
    while n == 5.0: 
     n = randomInterval(-5.,5.) # since X is [-5,5) 
    Sum += n 
    x = np.append(x, n) 

A = Sum/N 

for sample in range(0,int(N)): 
    summation = (x[sample] - A)**2.0 

standard_deviation = np.sqrt((1./N)*summation) 
+1

10e6!= 10 ** 6。基于这个问题,我认为你的意思是第五行的1e6。 – job 2011-04-12 19:29:16

+4

@job,你可以得到我的投票来获得当天的最佳优化。这应该会提供10倍的加速。 – 2011-04-12 19:35:58

+2

请注意,每次通过循环而不是递增时,您的'summation'变量将被覆盖。同样在Python 2.X中,你应该使用'xrange'而不是'range',所以当一个生成器更高效时,你不会创建一个非常大的列表来充当计数器。 – JoshAdel 2011-04-12 19:37:12

回答

3

你犯了一个不错的尝试,但要确保你理解这一点,因为这是HW

import numpy as np 
N = int(1e6) 
a = np.random.uniform(-5,5,size=(N,)) 
standard_deviation = np.std(a) 

这是假设你可以使用一个包状numpy的不明确的复制(您标记它因此)。如果可以的话,还有一大堆方法可以让你创建和操作数据数组,从而避免显式循环(这是在有效的方式下完成的)。这将是很好的看看文件,看看哪些功能,以及如何使用它们:

http://docs.scipy.org/doc/numpy/reference/index.html

+0

谢谢!我认为他把X设为[-5,5],所以np.random.uniform(-5,5,size =(N,))不起作用,但这绝对是我应该采用的路线。 – drinck 2011-04-12 22:21:03

1

使用发现on this wiki page for Variance的公式,你可以计算它在一个循环中不存储列表随机数字(假设你在其他地方不需要它们)。