Python 插值
通常我们在文献中看到很多色彩比较光滑的图,分辨率似乎很高,其实并非作者真正算了特别多的数据,而是根据少量数据拟合出来的。一维、二维例子和代码如下:
01.py
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
xn = np.linspace(0, 4, 100)
y0 = np.cos(xn**2/3+4)
yn = np.interp(xn, x, y)
plt.plot(xn, y0, '--k', label='True values')
plt.plot(x, y, 'ok', label='Known points')
plt.plot(xn, yn, label='Interpolated values')
plt.legend()
plt.savefig('01.png')
plt.show()
~
如果把yn 更改为
f = interpolate.interp1d(x, y, kind='linear')
yn = f(xn)
效果一样
02.py
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
x = np.linspace(0, 4, 12)
y = np.cos(x**2/3+4)
xn = np.linspace(0, 4, 100)
y0 = np.cos(xn**2/3+4)
#yn = np.interp(xn, x, y)
f = interpolate.interp1d(x, y, kind='linear')
yn = f(xn)
plt.plot(xn, y0, '--k', label='True values')
plt.plot(x, y, 'ok', label='Known points')
plt.plot(xn, yn, label='Interpolated values')
plt.legend()
plt.savefig('02.png')
plt.show()
~
03.py
f = interpolate.interp1d(x, y, kind='nearest')
yn = f(xn)
04.py
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
def f0(x, y):
return np.sin(2*np.pi*x)**2 + np.sin(2*np.pi*y)**2
grid_xn, grid_yn = np.mgrid[0:1:200j, 0:1:200j]
xn = grid_xn[:,0]
yn = grid_yn[0,:]
z0 = f0(grid_xn, grid_yn)
plt.pcolor(grid_xn, grid_yn, z0)
plt.colorbar()
plt.savefig('05.png')
plt.show()
06.py
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
def f0(x, y):
return np.sin(2*np.pi*x)**2 + np.sin(2*np.pi*y)**2
points = np.random.rand(500, 2)
values = f0(points[:, 0], points[:, 1])
plt.scatter(points[:, 0], points[:, 1], c=values)
plt.colorbar()
plt.axis([0,1,0,1])
plt.savefig('06.png')
plt.show()
07.py
通常我们在文献中看到很多色彩比较光滑的图,其实并非作者算了特别多的数据。比如下图原始数据
分辨率不是很高,每个小方块之间有明显的分界限,色彩不光滑。经过二维插值拟合后
可以看到图像变得光滑了。
代码如下 ( 感谢信息和计算机学院自动化专业16级 石璞金同学的协助帮忙)
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt
l0=20
ln = 200 # grid size for output
def f0(x, y):
return np.sin(2*np.pi*x)**2 + np.sin(2*np.pi*y)**2
grid_xn, grid_yn = np.mgrid[0:1:200j,0:1:200j]
grid_x0, grid_y0 = np.mgrid[0:1:20j,0:1:20j]
x0 = np.reshape(grid_x0,l0*l0)
y0 = np.reshape(grid_y0,l0*l0)
xn = np.reshape(grid_xn,ln*ln)
yn = np.reshape(grid_yn,ln*ln)
points0 = [[0.1 for xx0 in range(2)] for yy0 in range(l0*l0)]
pointsn = [[0.1 for xxn in range(2)] for yyn in range(ln*ln)]
points0 = np.array(points0)
pointsn = np.array(pointsn)
for i in range(l0*l0):
points0[i,0] = x0[i];
points0[i,1] = y0[i];
print points0[i,0],points0[i,1],x0[i],y0[i]
for i in range(ln*ln):
pointsn[i,0] = xn[i];
pointsn[i,1] = yn[i];
print pointsn[i,0],pointsn[i,1],xn[i],yn[i]
#points = np.random.rand(500, 2)
values = f0(points0[:, 1], points0[:, 0])
print values
f = interpolate.LinearNDInterpolator(points0[:,0:2], values)
zn = f(grid_xn, grid_yn)
z0 = f0(grid_x0,grid_y0)
plt.subplot(2,1,1)
plt.title("Orignal, not smooth")
plt.pcolor(grid_x0, grid_y0, z0)
plt.colorbar()
plt.axis([0,1,0,1])
plt.subplot(2,1,2)
plt.title("Fitted, smooth now")
print np.size(zn)
plt.pcolor(grid_xn, grid_yn, zn)
plt.axis([0,1,0,1])
plt.colorbar()
plt.tight_layout()
plt.savefig('07.png')
plt.show()
plt.close(all)