У меня есть значения для функции f (x, y) для значений x и y, например, подумайте о
x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)
Тогда я мог бы интерполировать эти точки данных на
f = interpolate.interp2d(x, y, z)
f_2 = interpolate.RectBivariateSpline(y, x, z)
Это пример, изложенный в документации по интерполяции .interp2d.
Теперь я могу легко построить данные.Но вы сразу же получите проблемы, когда захотите оценить f или f_2 при значении массива.Подробно f (5, [3,4]) дает то же значение, что и f (5, [4,3]) (потому что он сортирует внутри), а f_2 (5, [4,3]) выдаст код ошибки как[4,3] не сортируется, и поэтому мы должны отсортировать входные данные перед применением f_2.
Кстати, для моего приложения мне просто нужен многомерный массив во втором компоненте, но, вероятно, мой вопрос может быть интересен в целом.
Я использовал следующее ("медленноалгоритм "), чтобы преодолеть эту проблему и будет сравнивать его с циклом for:
X=np.random.uniform(-5,5,10**4)
1)" Простой "цикл For для f
benchmark = []
for i in np.arange(0,len(X)):
benchmark.extend(f(5,X[i]))
2) Не прибегая к результатуf:
z2 = f(5,X)
3) Обработка результата f:
z3 = [x for _,x in sorted(zip(np.argsort(X),f(5,X)))]
Этот способ применения был предложен Сортировка списка на основе значений из другого списка?
4) Не прибегая к результату f:
z4 = f_2(5,np.sort(X))
5) Прибегая к исходу f:
z5 = [x for _,x in sorted(zip(np.argsort(X),f_2(5,np.sort(X))[0]))]
Требуется следующее время:
time needed for benchmark was 0.214368
time needed for z2 was 0.000733 and compared to benchmark 306.983415 times faster
time needed for z3 was 0.011094 and compared to benchmark 20.286991 times faster
time needed for z4 was 0.001289 and compared to benchmark 166.319645 times faster
time needed for z5 was 0.009794 and compared to benchmark 22.979479 times faster
Очевидно, что z2 и z4 дают неправильный вывод, и поэтому z5 - мой любимый на данный момент, и он в 22 раза быстрее, чем цикл for
.Но так как z2 в 306 раз быстрее, я надеюсь, что есть возможность улучшить мой результат.Так как мне нужен такой вид расчета для большого набора данных и много раз, это действительно важно для меня.Есть ли у вас какие-либо идеи по улучшению курортов или какой-либо лучший способ интерполировать данные?
Спасибо за помощь!