与Scipy在任意点上插值和评估Numpy阵列的问题



我正在尝试复制MATLAB Interp2的某些功能。我以前知道有些类似的问题,但不适用于我的具体情况。

我有一个距离图(在此Google驱动器位置可用):https://drive.google.com/open?id=0b6acq_amk5e3x0q5ug1ya1vhsle&Authuser = 0

值在范围0-1中归一化。尺寸为200行x 300列。

我可以使用此代码片段加载它:

import numpy as np
dstnc1=np.load('dstnc.npy')

坐标由下一个片段定义:

xmin = 0.
xmax = 9000.
ymin = 0.
ymax = 6000.
r1,c1 = dstnc1.shape
x = np.linspace(xmin,xmax,c1)
y = np.linspace(ymin, ymax,r1)

我有三个由vectors xnew1,ynew1定义的映射点:

xnew1=[3700.540199,3845.940199,3983.240199]
ynew1=[1782.8611,1769.862,1694.862]

我检查了他们相对于距离映射的位置:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(20, 16))
ax = fig.add_subplot(1, 1, 1)
plt.imshow(dstnc1, cmap=my_cmap_r,vmin=0,vmax=0.3,
           extent=[0, 9000, 0, 6000], origin='upper')
plt.scatter(xnew1, ynew1, s=50, linewidths=0.15)
plt.show()

他们在正确的位置绘制。现在我想提取这三个点的距离值。我尝试了第一个interp2d

from scipy.interpolate import interp2d
x1 = np.linspace(xmin,xmax,c1)
y1 = np.linspace(ymin,ymax,r1)
f = interp2d(x1, y1, dstnc1, kind='cubic')

但是,当我尝试评估以下内容时:

test=f(xnew1,ynew1)

我得到此错误:

--------------------
ValueError                                Traceback (most recent call last)
<ipython-input-299-d0f42e609b23> in <module>()
----> 1 test=f(xnew1,ynew1)
C:...AppDataLocalContinuumAnacondalibsite-packagesscipyinterpolateinterpolate.pyc
in __call__(self, x, y, dx, dy)
    270                                 (self.y_min, self.y_max)))
    271
--> 272         z = fitpack.bisplev(x, y, self.tck, dx, dy)
    273         z = atleast_2d(z)
    274         z = transpose(z)
C:...AppDataLocalContinuumAnacondalibsite-packagesscipyinterpolatefitpack.pyc
in bisplev(x, y, tck, dx, dy)
   1027     z,ier = _fitpack._bispev(tx,ty,c,kx,ky,x,y,dx,dy)
   1028     if ier == 10:
-> 1029         raise ValueError("Invalid input data")
   1030     if ier:
   1031         raise TypeError("An error occurred")
ValueError: Invalid input data

如果我尝试RectBivariateSpline

from scipy.interpolate import RectBivariateSpline
x2 = np.linspace(xmin,xmax,r1)
y2 = np.linspace(ymin,ymax,c1)
f = RectBivariateSpline(x2, y2, dstnc1)

我得到此错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-302-d0f42e609b23> in <module>()
----> 1 test=f(xnew1,ynew1)
C:...AppDataLocalContinuumAnacondalibsite-packagesscipyinterpolatefitpack2.pyc
in __call__(self, x, y, mth, dx, dy, grid)
    643                 z,ier = dfitpack.bispev(tx,ty,c,kx,ky,x,y)
    644                 if not ier == 0:
--> 645                     raise ValueError("Error code returned by
bispev: %s" % ier)
    646         else:
    647             # standard Numpy broadcasting
ValueError: Error code returned by bispev: 10

关于我是使用错误的功能还是权利的任何建议具有错误的语法功能,以及如何修复它。谢谢。

更新

我正在运行Python 2.7.9和Scipy 0.14.0(在Continuum anaconda上)如Scipy邮件列表中的发布,文档似乎令人困惑,是Scipy 0.14.0和下一个版本的混合。任何人都可以建议版本0.14.0的解决方法或正确的语法。

更新2

尝试

xnew1=np.array([3700.540199,3845.940199,3983.240199])
ynew1=np.array([1782.8611,1769.862,1694.862])

如建议的注释,但仍然存在错误。

此语法与Rectbivariatespline一起使用

x2 = np.linspace(xmin,xmax,c1)
y2 = np.linspace(ymin,ymax,r1)
f2 = sp.interpolate.RectBivariateSpline(x2, y2, dstnc1.T,kx=1, ky=1)

我可以在新的点上评估:

out2 = f2.ev(xnew1,ynew1)

对于Interp2D,我被困,因为我无法绕过办公室的防火墙来更新Anaconda(Windows)。我可能可以在MAC安装中在家中,在这种情况下,如果我正确地获得语法,我将添加到Thsi答案中。

最新更新