Я пытаюсь выполнить простую билинейную интерполяцию двухмерного набора данных, но результаты неожиданные.Когда я строю свой набор данных как контур, он выглядит нормально, но когда я генерирую LinearNDInterpolator и выборка на более плотной сетке, артефакты в интерполяции становятся очевидными.Сам контурный график, конечно, интерполирует фактические заданные точки данных, и все, что мне нужно, это тот же результат, который отображается на контурном графике, но я не могу получить его с помощью LinearNDInterpolator или interp2d.Фактически, interp2d приводит к почти бессмысленной функции даже для kind='linear'
.Я думаю, что мне здесь не хватает чего-то фундаментального, но я не могу понять, почему у меня так много проблем с простой линейной интерполяцией между точками.Вот пример того, что я делаю, надеюсь, я совершаю очевидную ошибку.
import numpy as np
from scipy.interpolate import LinearNDInterpolator
import matplotlib.pyplot as plt
x = np.linspace(0, 10, num=10)
y = np.linspace(0, 10, num=10)
z = np.array([[ 76.075 , 78.125 , 80.15 , 81.46875, 82.53125, 83.69375, 84.25 , 84.59375, 85.275 , 85.9375 ],
[ 72.4625 , 74.95625, 76.45 , 77.98125, 79.36875, 80.1875 , 81.09375, 81.94375, 82.56875, 83.04375],
[ 65.20625, 70.425 , 72.45625, 73.9625 , 75.74375, 76.7 , 77.90625, 78.4 , 79.4875 , 80.00625],
[ 0. , 65.4875 , 67.66875, 69.93125, 71.70625, 72.7 , 73.98125, 74.95625, 75.6 , 76.6875 ],
[ 0. , 0. , 55.6875 , 64.8125 , 66.16875, 67.91875, 69.35 , 70.3 , 71.64375, 72.00625],
[ 0. , 0. , 0. , 42.6625 , 59.5625 , 61.15 , 62.10625, 64.19375, 65.1125 , 66.2 ],
[ 0. , 0. , 0. , 0. , 28.49375, 53.14375, 54.3875 , 55.89375, 57.1 , 58.275 ],
[ 0. , 0. , 0. , 0. , 0. , 11.84375, 44.5125 , 46.91875, 47.975 , 48.66875],
[ 0. , 0. , 0. , 0. , 0. , 0. , 3.16875, 32.50625, 36.96875, 37.7625 ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.175 , 17.8125 , 26.6875 ]])
plt.contour(x,y,z,20)
X, Y = np.meshgrid(x,y)
pts = list(zip(X.flatten(),Y.flatten()))
interp = LinearNDInterpolator(pts,z.flatten())
x2 = np.linspace(0, 10, num=100)
y2 = np.linspace(0, 10, num=100)
X2, Y2 = np.meshgrid(x2, y2)
Z2= interp(X2, Y2)
plt.contour(X2,Y2,Z2, 20, linestyles='dashed')
plt.show()
Сплошные линии - данные, пунктир - интерполяция