# mean ans std dev of an array?

Robert Kern robert.kern at gmail.com
Wed Oct 25 01:42:37 CEST 2006

```Paul McGuire wrote:
> <skip at pobox.com> wrote in message
> news:mailman.1106.1161715405.11739.python-list at python.org...
>>    >> n = len(a)
>>    >> mean = sum(a) / n
>>    >> sd = sqrt(sum((x-mean)**2 for x in a) / n)
>>    ...
>>    >> If there is a faster way... like transferring the array to a
>>    >> different container class...  but what?
>>
>> Perhaps:
>>
>>    >>> import scipy
>>    >>> print scipy.mean([1,2,3,4,5,6])
>>    3.5
>>    >>> print scipy.std([1,2,3,4,5,6])
>>    1.87082869339
>>
>> Skip

Note that those are also in numpy, now.

> Can scipy work with an iterator/generator?

There is a fromiter() constructor for 1D arrays. The basic array() constructor
(which is used by the other functions like mean() and std() to create an array
from a non-array sequence) doesn't quite have enough information to consume
generic iterators. The mean() and std() algorithms operate on arrays, not
generic iterators.

> If you can only make one pass
> through the data, you can try this:
>
> lst = (random.gauss(0,10) for i in range(1000))
> # compute n, sum(x), and sum(x**2) with single pass through list
> n,sumx,sumx2 = reduce(lambda a,b:(a+b,a+b,a+b), ((1,x,x*x)
> for x in lst) )
> sd = sqrt( (sumx2 - (sumx*sumx/n))/(n-1) )

Don't do that. If you *must* restrict yourself to one pass, there are better
algorithms.

http://en.wikipedia.org/wiki/Algorithms_for_calculating_variance

--
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma