У меня есть трехмерный массив, который мне нужно интерполировать по одной оси (последнее измерение). Скажем y.shape = (nx, ny, nz), я хочу интерполировать в nz для каждого (nx, ny). Тем не менее, я хочу, чтобы интерполяция для другого значения в каждом [i, j].
Вот пример кода. Если бы я хотел интерполировать на одно значение, скажем new_z, я бы использовал scipy.interpolate.interp1d, как этот
# y is a 3D ndarray
# x is a 1D ndarray with the abcissa values
# new_z is a number
f = scipy.interpolate.interp1d(x, y, axis=-1, kind='linear')
result = f(new_z)
Однако для этой проблемы я действительно хочу, чтобы интерполяция к другому new_z для каждого y[i, j]. Поэтому я делаю это:
# y is a 3D ndarray
# x is a 1D ndarray with the abcissa values
# new_z is a 2D array
result = numpy.empty(y.shape[:-1])
for i in range(nx):
    for j in range(ny):
        f = scipy.interpolate.interp1d(x, y[i, j], axis=-1, kind='linear')
        result[i, j] = f(new_z[i, j])
К сожалению, с несколькими циклами это становится неэффективным и медленным. Есть ли лучший способ сделать такую интерполяцию? Достаточна линейная интерполяция. Возможность реализовать это в Cython, но я пытался избежать этого, потому что я хочу иметь гибкость перехода на кубическую интерполяцию и не хочу делать это вручную в Cython.