[Numpy-discussion] Fast function application on list of 2D points?

Paulo J. S. Silva pjssilva at ime.usp.br
Mon Jan 12 09:50:05 EST 2009


Eric,

You question raised my attention due to a recent post of mine related to
the same kind of problem. I was solving it without using
apply_along_axis (due to ignorance).

However I tried to use apply_along_axis to solve my problem and it
proved to be very slow. Try the following:

----------- 

import numpy as np
import time

def filter(x):
    return x.sum()

a = np.random.random((2, 1000000))

# Apply filter to all points, version 1
t = time.clock()
sums1 = np.apply_along_axis(filter, axis=0, arr=a)
print 'Elapsed time', time.clock() - t

# Apply filter to all points, version 2
t = time.clock()
sums2 = np.array([filter(p) for p in a.T])
print 'Elapsed time', time.clock() - t

print sums1 == sums2

------------

In my computer the first version takes more than 6.5 longer than the
second. However the version 2 is using list comprehensions instead of a
numpy function. I would expected it to be slower. It looks like
apply_along_axis is creating many temporary arrays.

Eric, it looks like you should try something along the second version
above and see if it is faster in your case too.

Paulo




More information about the NumPy-Discussion mailing list