python插值_Python 插值

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值