无法在Python scipy.interp中解释MATLAB interp2d

时间:2016-03-12 08:57:32

标签: python python-2.7 python-3.x scipy

以下代码只是为了理解上下文。我的问题不需要太多了解这一点。它需要将一行MATLAB代码简单地转换为Python。

us = np.linspace(-(1023)/2,(1023)/2,1024)
vs = np.linspace(-(1023)/2,(1023)/2,1024)
uu,vv = np.meshgrid(-us,vs)
pu = ((((rx*SDD)/(ry+SOD))+us[0])/(-du))+1

xs = np.linspace(-(360-1)/2,(nx-1)/2,360)
ys = np.linspace(-(360-1)/2,(ny-1)/2,360)
zs = np.linspace(-(360-1)/2,(ny-1)/2,360)

xx,yy = np.meshgrid(xs,ys)

angle_rad = np.linspace(0,359,360)
angle_rad = angle_rad*np.pi/180

for i in range(0,360) :
    vol = np.zeros((360,360,360))
    rx = xx*np.cos(angle_rad[i]-np.pi/2) + yy*np.sin(angle_rad[i]-np.pi/2)
    ry = -xx*np.sin(angle_rad[i]-np.pi/2) + yy*np.cos(angle_rad[i]-np.pi/2)
    pu = ((((rx*370)/(ry+9))+us[0])/(-51.2/1024))+1

    for iz in range(0,360) :
        pv = ((((zs[iz]*370)/(ry+9))-vs[0])/(51.2/1024)) +1

所以在这一步之后代码应该进行插值,在MATLAB中就是这样:

vol(:,:,iz) = interp2(uu,vv ,proj',pu,pv,'linear'); This is in MATLAB

我的proj,uu和vv是(1024,1024)和pu,pv是(360,360)。我需要将上面的行转换为Python。我尝试使用scipy.interpolate,但在尝试这些时出现以下错误:

vol[:,:,iz] = Ratio*(interp2d(uu,vv,proj,pu,pv,'cubic'))

TypeError:不可用类型:'numpy.ndarray'

vol[:,:,iz] = Ratio*(interp2d(uu,vv,proj,'cubic'))

OverflowError:要插入的数据点太多

vol[:,:,iz] = Ratio*(interp2d(proj,pu,pv,'cubic'))

ValueError:对于非矩形网格

,x和y的长度必须相等
vol[:,:,iz] = Ratio*(interp2d(pu,pv,proj,'cubic'))

ValueError:非矩形网格的输入z的长度无效

我已阅读所有scipy.interpolate文件,似乎没有人提供帮助。谁能弄明白什么是错的?

1 个答案:

答案 0 :(得分:1)

大范围的问题是您正在查看文档,但您并未尝试理解它。如果您正在使用模块interp2d中的特定功能scipy.interpolate,则使用look at the function's documentation@pv also suggested in a comment。你在这个地方抛出争论的事实清楚地表明你正在尝试使用基于猜测的函数。它不会起作用:一个函数是用给定的语法实现的,它只会像那样工作。

请看一下该功能的签名:

  

class scipy.interpolate.interp2d(x,y,z,kind =' linear',copy = True,bounds_error = False,fill_value = nan)

之后解释参数的含义。您可以清楚地看到有3个必填参数:xyz。不允许使用其他数组值输入这是因为interp2d仅构造插值函数,然后您应该使用它来计算网格上的插值(与MATLAB不同,其中{{1}直接给出插值())。所以你可以打电话给

interp2d

获取插值函数。然后,您可以替换给定的值,但请注意函数myfun = interp2(uu,vv,proj,'linear') 将需要1d输入,并且它将在内部构造网格。假设您的输出网格构造为

myfun

(可能不是这种情况,但我稍后会再回过头来看),你需要

puu,puv = np.meshgrid(puu_vec,puv_vec)

获取所需的输出。

但是,您应该注意一些重点。

  1. 在MATLAB中,您有vol[:,:,iz] = Ratio*myfun(puu_vec,puv_vec) ,但要确保interp2d(uu,vv,proj',...) scipyuuvv的元素的顺序相同。为了安全起见:如果网格尺寸不对称,projuuvv的形状应该都相同。
  2. 在MATLAB中你使用proj插值,而在python中你使用'linear'。如果您将代码移植到新语言,我不确定这是否是您想要的。
  3. 在我看来,您的输出网格不是由矩形网格定义,就像来自'cubic',这表明interp2d might not be suitable for your case。无论如何,I've had some odd experiences with interp2d,我不会相信它。因此,如果它不适合您的预期输出,我强烈建议您使用scipy.interpolate.griddata。此功能直接为您提供插值点:我建议您尝试根据手册找出其用途:)我的链接答案也可以提供帮助。您可以以相同的方式设置插值类型,但如果您愿意,您的输出可以是任何一组散点。