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[0]+b[0],a[1]+b[1],a[2]+b[2]), ((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
that is made terrible by our own mad attempt to interpret it as though it had
an underlying truth."
-- Umberto Eco
More information about the Python-list
mailing list