У меня есть трехмерный массив, который мне нужно интерполировать по одной оси (последнее измерение). Скажем 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.