Ошибки в билинейной интерполяции с использованием scipy LinearNDInterpolator - PullRequest
0 голосов
/ 15 октября 2018

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

Сплошные линии - данные, пунктир - интерполяция

...