[Numpy-discussion] Faster

Keith Goodman kwgoodman at gmail.com
Fri May 2 21:16:05 EDT 2008


On Fri, May 2, 2008 at 6:05 PM, Robert Kern <robert.kern at gmail.com> wrote:
> On Fri, May 2, 2008 at 7:24 PM, Keith Goodman <kwgoodman at gmail.com> wrote:
>
>
> > How can I make this function faster? It removes the i-th row and
>  >  column from an array.
>  >
>  >  def cut(x, i):
>  >     idx = range(x.shape[0])
>  >     idx.remove(i)
>  >     y = x[idx,:]
>  >     y = y[:,idx]
>  >     return y
>  >
>  >  >> import numpy as np
>  >  >> x = np.random.rand(500,500)
>  >  >> timeit cut(x, 100)
>  >  100 loops, best of 3: 16.8 ms per loop
>
>  I can get a ~20% improvement with the following:
>
>  In [8]: %timeit cut(x, 100)
>  10 loops, best of 3: 21.6 ms per loop
>
>  In [9]: def mycut(x, i):
>    ...:     A = x[:i,:i]
>    ...:     B = x[:i,i+1:]
>    ...:     C = x[i+1:,:i]
>    ...:     D = x[i+1:,i+1:]
>    ...:     return hstack([vstack([A,C]),vstack([B,D])])
>    ...:
>
>  In [10]: %timeit mycut(x, 100)
>  10 loops, best of 3: 17.3 ms per loop
>
>  The hstack(vstack, vstack) seems to be somewhat better than
>  vstack(hstack, hstack), at least for these sizes.

Wow. I never would have come up with that. And I probably never will.

Original code:
>> cluster.test2(500)
n = 500 took 5.28 seconds

Your improvement:
>> cluster.test2(500)
n = 500 took 3.52 seconds

Much more than a 20% improvement when used in the larger program. Thank you.



More information about the NumPy-Discussion mailing list