[Numpy-discussion] slow numpy.clip ?

Robert Kern robert.kern at gmail.com
Tue Dec 19 03:37:51 CST 2006

David Cournapeau wrote:

> Basically, at least from those figures, both versions are pretty 
> similar, and not worth improving much anyway for matplotlib. There is 
> something funny with numpy version, though.

Looking at the code, it's certainly not surprising that the current
implementation of clip() is slow. It is a direct numpy C API translation of the
following (taken from numarray, but it is the same in Numeric):

def clip(m, m_min, m_max):
    """clip()  returns a new array with every entry in m that is less than m_min
    replaced by m_min, and every entry greater than m_max replaced by m_max.
    selector = ufunc.less(m, m_min)+2*ufunc.greater(m, m_max)
    return choose(selector, (m, m_min, m_max))

Creating that integer selector array is probably the most expensive part.
Copying the array, then using putmask() or similar is certainly a better
approach, and I can see no drawbacks to it.

If anyone is up to translating their faster clip() into C, I'm more than happy
to check it in. I might also entertain adding a copy=True keyword argument, but
I'm not entirely certain we should be expanding the API during the 1.0.x series.

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 Numpy-discussion mailing list