使用scipy LinearNDInterpolator的双线性插值中的错误

时间:2018-10-15 18:46:51

标签: python scipy interpolation

我正在尝试对2d数据集进行简单的双线性插值,但是结果出乎意料。当我将数据集绘制为轮廓时,它看起来不错,但是当我生成LinearNDInterpolator并在插值较密集的网格物体上采样时,显而易见。当然,等高线图本身是在给定的实际数据点之间进行插值,而我想要的只是在等高线图上显示的相同结果,但是我似乎无法通过LinearNDInterpolator或interp2d获得它。实际上,即使对于kind='linear',interp2d也会产生几乎毫无意义的功能。我想我这里必定缺少一些基本知识,但我不明白为什么在点之间进行简单线性插值时会遇到很多麻烦。这是我正在做的一个示例,希望我犯了一些明显的错误。

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()

实线是数据,点线是插值

0 个答案:

没有答案