[Numpy-discussion] Faster
Keith Goodman
kwgoodman at gmail.com
Fri May 2 23:20:04 EDT 2008
On Fri, May 2, 2008 at 7:25 PM, Robert Kern <robert.kern at gmail.com> wrote:
> On Fri, May 2, 2008 at 9:02 PM, Keith Goodman <kwgoodman at gmail.com> wrote:
> > You're right. Finding the distance is slow. Is there any way to speed
> > up the function below? It returns the row and column indices of the
> > min value of the NxN array x.
> >
> > def dist(x):
> > x = x + 1e10 * np.eye(x.shape[0])
> > i, j = np.where(x == x.min())
> >
> > return i[0], j[0]
>
> Assuming x is contiguous and you can modify x in-place:
>
>
> In [1]: from numpy import *
>
> In [2]: def dist(x):
> ...: x = x + 1e10 * eye(x.shape[0])
> ...: i, j = where(x == x.min())
>
> ...: return i[0], j[0]
> ...:
>
> In [3]: def symmdist(N):
> ...: x = random.rand(N, N)
> ...: x = x + x.T
> ...: x.flat[::N+1] = 0
> ...: return x
> ...:
>
> In [4]: symmdist(5)
> Out[4]:
> array([[ 0. , 0.87508654, 1.11691704, 0.80366071, 0.57966808],
> [ 0.87508654, 0. , 1.5521685 , 1.74010886, 0.52156877],
> [ 1.11691704, 1.5521685 , 0. , 1.22725396, 1.04101992],
> [ 0.80366071, 1.74010886, 1.22725396, 0. , 1.94577965],
> [ 0.57966808, 0.52156877, 1.04101992, 1.94577965, 0. ]])
>
> In [5]: def kerndist(x):
> ...: N = x.shape[0]
> ...: x.flat[::N+1] = x.max()
> ...: ij = argmin(x.flat)
> ...: i, j = divmod(ij, N)
> ...: return i, j
> ...:
>
> In [10]: x = symmdist(500)
>
> In [15]: %timeit dist(x)
> 10 loops, best of 3: 19.9 ms per loop
>
> In [16]: %timeit kerndist(x)
> 100 loops, best of 3: 4.38 ms per loop
This change and your previous one cut the run time from 5.28 to 2.23
seconds. Thank you.
More information about the NumPy-Discussion
mailing list