I am modeling a linear process at a number of equally spaced time steps. I have a large list (~70k elements) which corresponds to a location at each time step,
timerange = np.linspace(0, time, iterations, False) * speed. For each element in this list, I want to compare its value (location) to two other lists and see if that location falls within a valid region. These two other lists,
rot.RegionEnds (~150 elements) contains the start and end locations, respectively, of each region.
I began tackling this problem with list comprehension, using the following code to achieve the desired result.
valid = np.asarray([any((t * dt * speed >= rot.RegionStarts) & (t * dt * speed < rot.RegionEnds) for t in range(iterations)])
Upon using this, I realized that execution was rather slow, about 0.4s each time. As make several hundred calls to this line, this greatly slows down the process. I tried using numpy to achieve a similar effect, which required lots of reshaping and repeating.
valid = np.any(np.logical_and( np.greater_equal(np.repeat(np.reshape(timerange, (-1, 1)), rot.RegionStarts.shape, axis=1), np.repeat(np.reshape(rot.RegionStarts, (1, -1)), timerange.shape, axis=0)), np.less(np.repeat(np.reshape(timerange, (-1, 1)), rot.RegionEnds.shape, axis=1), np.repeat(np.reshape(rot.RegionEnds, (1, -1)), timerange.shape, axis=0)), axis = 1)
Unfortunately, this saw very little performance increase (~0.25s), probably due to the large size of arrays being repeated. Removing lines like
np.repeat cause problems aligning shape; element-wise
& could not be executed on 2-d arrays.
What optimization techiniques can be used speed up this code?