Эта проблема аналогична предыдущей заданной проблеме Fast interpolation over 3D array, но не может решить мою проблему.Быстрая интерполяция по 3D-массиву для 3D-начала x
У меня есть 4D-массив с размерами (время, высота, широта, долгота), обозначенное как y.shape=(nt, nalt, nlat, nlon)
. X - высота и изменение с (время, широта, долгота), что означает x.shape = (nt, nalt, nlat, nlon)
. Я хочу интерполировать на высоте для каждого (nt, nlat, nlon). Интерполированное x_new должно быть 1d, а не изменять (время, широта, долгота).
Я использую numpy.interp
, то же, что и scipy.interpolate.interp1d
, и подумайте об ответах на прежнем посту. Я не могу уменьшить петли с этими ответами.
я могу только так:
# y is a 4D ndarray
# x is a 4D ndarray
# new_y is a 4D array
for i in range(nlon):
for j in range(nlat):
for k in range(nt):
y_new[k,:,j,i] = np.interp(new_x, x[k,:,j,i], y[k,:,j,i])
Эти петли делают это интерполяция слишком медленно расчета. У кого-нибудь есть хорошие идеи? Помощь будет высоко оценена.
Если new_x находится в порядке возрастания, я думаю, вы можете написать функцию Cython, чтобы увеличить скорость вычислений. – HYRY
@HYRY New_x находится в порядке возрастания. Но исходный х может быть не в порядке возрастания. Это доступно? Я не знаком с Китоном, возможно, потребуется некоторое время, чтобы изучить его или узнать код тиаго в бывшем посте. – Hao
но, 'numpy.interp' нужно' x' в порядке возрастания, вам нужно сначала отсортировать x, y по x. – HYRY