在使用scipy.interpolate.interp2d对数据插值时,发现输出的数据图像并不相同,然后找了一下原因。
坐标用的是经纬度数据,粗细的纬度数据都是从60~-60这样排列的,原因应该就是插值完的输出坐标应该都是从小到大排序(即从负到正),因此导致不同。
scipy.interpolate.interp2d
官方文档:https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp2d.html#scipy.interpolate.interp2d
例子如下:
import numpy as np import matplotlib.pyplot as plt from scipy import interpolate x = np.arange(-3.01, 5.01, 0.25) y = np.arange(-1.01, 5.01, 0.25) xx, yy = np.meshgrid(x, y) #建立原始坐标 z = np.sin(xx**2+yy**2) #建立原始数据 f = interpolate.interp2d(x, y, z, kind='cubic') xnew = np.arange(5.01, -3.01, -1e-2) ynew = np.arange(-1.01, 5.01, 1e-2) znew = f(xnew, ynew) #插值后的数据
展示结果
plt.imshow(z)
plt.imshow(znew)
如果把x
换成从正到负的横坐标列:
x = np.arange(5.01, -3.01, -0.25) y = np.arange(-1.01, 5.01, 0.25) xx, yy = np.meshgrid(x, y) z = np.sin(xx**2+yy**2) plt.imshow(z)
直接画图有:
但是如果把xnew
换成从正到负的横坐标列,这时产生的znew
的横坐标并不与xnew
对应,而是从小到大从负到正:
x = np.arange(-3.01, 5.01, 0.25) y = np.arange(-1.01, 5.01, 0.25) xx, yy = np.meshgrid(x, y) z = np.sin(xx**2+yy**2) f = interpolate.interp2d(x, y, z, kind='cubic') xnew = np.arange(5.01, -3.01, -1e-2) ynew = np.arange(-1.01, 5.01, 1e-2) znew = f(xnew, ynew) plt.imshow(znew)
应该就是不管设定的坐标顺序是怎样,查之后的结果都是按照坐标从小到大排列的。
如果是用于地理信息数据的插值的时候要注意。