Just from my own experience: I'd post this at stackoverflow.com, still my
favorite QA site. Definitely someone out there you has an answer to your
question within no time.

Greets,
Lars

2012/9/25 Gijs Molenaar <g...@pythonic.nl>

> Hallo Pythonic mensen,
>
> Ik heb een numpy snelheids probleem. TL;DR Waarom is rekenen met een
> masked array zo langzaam? Of doe ik iets niet goed?
>
> Ik heb een matrix met waardes, en ik wil iteratief alle waardes uit de
> matrix maskeren boven een bepaalde sigma vanaf de median. het gaat
> uiteindelijk om de RMS waarde van een signaal plaatje te berekenen.
> Boeit voor de rest niet, maar dan weet je waar ik het voor gebruik.
>
> Ik vond ergens in onze code base een stuk code die dit min of meer doet:
>
> def clip(data, sigma=3):
>     median = numpy.median(data)
>     std = numpy.std(data)
>     newdata = data[numpy.abs(data-median) <= sigma*std]
>     if len(newdata) and len(newdata) != len(data):
>         return clip(newdata, sigma)
>     else:
>         return newdata
>
> Van de matrix die hier uit komt kan je makkelijk de RMS berekenen. maar
> mijn eerste idee was dat het vrij langzaam zou zijn, omdat het recursief
> elke keer een nieuwe array alloceert. Ik had het idee dat het maskeren
> van je waardes veel sneller zou zijn. Maar als ik het stukje herschrijf
> gebruik makende van maskedarrays [1] en vervolgens dit mask gebruik
> wordt de code echt veel trager (+/- 8x). Ik las ergens dat MaskedArray
> zo traag is omdat het native in Python wordt gedaan, omdat het vrij
> lastig is mask operaties in low level C loops te doen [2], maar ik weet
> niet of dat nou echt waar is. Ik heb een tijd zitten pielen om het toch
> zo snel mogelijk te krijgen (zonder maskedarrays) en kom tot het
> volgende stukje code:
>
> def clip(data, sigma=3):
>     mask = numpy.zeros(data.shape, bool)
>     new_mask = numpy.zeros(data.shape, bool)
>     masked = data
>     while True:
>         median = numpy.median(masked)
>         std = numpy.std(masked)
>         new_mask[numpy.abs(data - median) > sigma * std] = True
>         diff = new_mask & ~mask
>         mask = mask | new_mask
>         if not diff.any():
>             return mask
>         masked = data[~mask]
>         new_mask[:,:] = False
>
> Dat uiteindelijk toch nog 2 keer zo traag is. Iemand een idee hoe ik het
> toch sneller kan doen? En kunnen we maar beter masks niet gebruiken? Ik
> heb veel met matlab gewerkt en ik had altijd het idee dat het gebruiken
> van masks 'the way to go' is...
>
> Thanks!
>
> [1] http://docs.scipy.org/doc/numpy/reference/maskedarray.html
> [2]
>
> http://stackoverflow.com/questions/5760668/python-numpy-masked-arrays-are-very-slow
> --
> Gijs Molenaar
> http://pythonic.nl
>
>
> _______________________________________________
> Python-nl mailing list
> Python-nl@python.org
> http://mail.python.org/mailman/listinfo/python-nl
>
>
_______________________________________________
Python-nl mailing list
Python-nl@python.org
http://mail.python.org/mailman/listinfo/python-nl

Antwoord per e-mail aan