我正在将同事IDL代码重写为python,并提出了一些令我感到困惑的差异。根据其他SO问题和邮件列表线程,我发现如果您使用scipy.ndimage.interpolation.map_coordinates并指定order=1,则应该执行双线性插值。当比较IDL代码(在GDL中运行)和python(map_coordinates)之间的结果时,我得到了不同的结果。然后,我尝试使用mpl_toolkits.basemap.interp,结果与IDL代码相同。下面是一个简单的示例,显示了错误所在。有人可以帮助我找出map_coordinates在做什么,还是order=1不是双线性的?

from scipy.ndimage.interpolation import map_coordinates
from mpl_toolkits.basemap import interp
import numpy

in_data = numpy.array([[ 25.89125824,  25.88840675],[ 25.90930748,  25.90640068]], dtype=numpy.float32)

map_coordinates(in_data, [[0.0],[0.125]], order=1, mode='nearest')
# map_coordinates results in "25.89090157"
interp(in_data, numpy.array([0,1]), numpy.array([0,1]), numpy.array([0.0]), numpy.array([0.125]), order=1)
# interp results in "25.89351439", same as GDL's "25.8935" when printed

我使用interp很好,但是我很好奇map_coordinates为什么没有返回相同的结果。我注意到map_coordinates文档没有提到双线性,实际上是双线性吗?我想念什么?

最佳答案

使用map_coordinates时,您需要转置数组或将坐标更改为(y,x)格式,因为数组的形状为(height, width)

from scipy.ndimage.interpolation import map_coordinates
from mpl_toolkits.basemap import interp
import numpy

in_data = numpy.array([[ 25.89125824,  25.88840675],[ 25.90930748,  25.90640068]], dtype=numpy.float32)

print map_coordinates(in_data.T, [[0.0],[0.125]], order=1, mode='nearest')
print interp(in_data, numpy.array([0,1]), numpy.array([0,1]), numpy.array([0.0]), numpy.array([0.125]), order=1)

这将输出:
[ 25.89351463]
[ 25.89351439]

关于python - Scipy map_coordinates双线性插值与interp和IDL插值的比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15057970/

10-10 03:07