2011年01月04日 星期二 17:58
我有一组格点,想用双线性插值,但是不知道哪个函数提供了这个方法?
试着用了一下interp2d这个函数,但并不是想要的结果。
比如令数组 a 为:
[[100, 10, 100]
[100, 10, 10]
[100, 10, 100]]
x = np.arange(3)
y = np.arange(3)
f = interp2d(x, y, a, kind = 'linear')
f(1.5, 1)打印出来的结果会是-11.6,而我希望的结果是10。是我哪个地方错了,还是这个函数在进行线性插值的时候考虑勒整个数组,而不仅仅是周围4个点?要怎样才能达到双线性插值的效果呢?
我用的暂时还是scipy 0.8, 0.9里面有的一个griddata函数还没有试过。
谢谢!
2011年01月04日 星期二 18:28
from scipy import interpolate
import numpy as np
a = np.array([[100.0, 10, 100],
[100, 10, 10],
[100, 10, 100]])
x, y = np.mgrid[:3,:3]
f = interpolate.interp2d(x, y, a, kind="linear")
print f(1.5, 1)
二维插值的用法在书中有介绍,x和y应该是用mgrid产生二维数组。
2011年01月04日 星期二 20:06
RY老师,那如果x和y是像我那样取值的话得到的结果是什么意思呢?我是看scipy的文档上说:
x, y : 1D arrays
Arrays defining the coordinates of a 2D grid. If the points lie on a regular grid, x can specify the column coordinates and y the row coordinates, for example:
x = [0,1,2]; y = [0,3,7]
otherwise x and y must specify the full coordinates, for example:
x = [0,1,2,0,1,2,0,1,2]; y = [0,0,0,3,3,3,7,7,7]
所以我觉得我那个数据是规则格点,我想写成那样应该可以吧,但是得出来的结果不一样。
还有就是书上说:interp2d 类只能对等间距的网格形状的取样值进行插值运算。那这里这个例子的 y 应该不算等间距吧?
2011年01月04日 星期二 20:54
前面我的程序有问题,应该是
y,x = np.mgrid[:3,:3]
结果和你的一样。因此interp2d不是简单的双线性插值。
我查了一下,双线性插值可以用ndimage模块中的map_coordinates
from scipy.ndimage.interpolation import map_coordinates
import numpy as np
a = np.array([[100.0, 10, 100],
[100, 10, 10],
[100, 10, 100]])
print map_coordinates(a, [[1.5],[1]], order=1)
2011年01月04日 星期二 21:05
map_coordinates的第二个参数是一个有两个元素的列表,其中每个元素都是一个列表,分别给出第0轴和第1轴的坐标。因此上面的例子是第0轴在1.5,第1轴在1的位置的值。
下面的程序对原始数据进行双线性插值,并显示结果图像:
from scipy.ndimage.interpolation import map_coordinates
import numpy as np
a = np.array([[100.0, 10, 100],
[100, 10, 10],
[100, 10, 100]])
x,y = np.mgrid[:2:100j,:2:100j]
z = map_coordinates(a,[x.flatten(),y.flatten()], order=1)
z = z.reshape(100,-1)
import pylab as pl
pl.imshow(z)
pl.show()
2011年01月04日 星期二 21:40
好的,明白了,谢谢!这种函数居然都能让您给找到。。。
Zeuux © 2024
京ICP备05028076号