pythonnumpyscipynumpy-ufunc

Vectorize Scipy cubic interpolation for multiple Numpy arrays


I have a np.array of 50 elements. For example:

data = np.array([9.22, 9. , 9.01, ..., 7.98, 6.77, 7.3 ])

For each element of the data np.array, I have a x and y data pair (both with the same length) that I want to interpolate with. For example:

x = np.array([[ 1, 2, 3, 4, 5 ],
              ...,
              [ 1.01, 2.01, 3.02, 4.03, 5.07 ]])
y = np.array([[0. , 1. , 0.95, ..., 0.07, 0.06, 0.06],
              ...,
              [0. , 0.99 , 0.85, ..., 0.03, 0.05, 0.06]])

I want to interpolate each data element with the respective np.array of x and y.

I have the following solution using map():

def cubic_spline(i):
     return scipy.interpolate.splev(x=data[i],
                                    tck=scipy.interpolate.splrep(x[i], y[i], k=3))

list(map(cubic_spline, np.arange(len(data)))

But I'm wondering if there is a way to do it directly with scipy and numpy to optimize the execution time. Something like:

scipy.interpolate.splev(x=data,
                        tck=scipy.interpolate.splrep(x, y, k=3))

Any suggestions will be appreciated. Thanks in advance.


Solution

  • If you have a single x array and multiple y arrays, newer interpolators (make_interp_spline, PchipInterpolator etc) support multidimensional y arrays automatically.

    If you really have a collection of pairs of 1D arrays, x and y, where x arrays differ, and you want scipy to loop over these datasets, then no, scipy does not support that. You'd need to loop over them manually.