我正在尝试对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()
实线是数据,点线是插值