使用 Scipy 在任意点插入和评估 numpy 数组的问题
Problems interpolating and evaluating numpy array at arbitrary points with Scipy
我正在尝试复制 Matlab 的 interp2 的一些功能。我知道之前有人问过类似的问题,但 none 适用于我的具体情况。
我有一张距离图(可在这个 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)
我用向量 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:\...\AppData\Local\Continuum\Anaconda\lib\site-packages\scipy\interpolate\interpolate.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:\...\AppData\Local\Continuum\Anaconda\lib\site-packages\scipy\interpolate\fitpack.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:\...\AppData\Local\Continuum\Anaconda\lib\site-packages\scipy\interpolate\fitpack2.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 邮件列表 here 上发布的那样,文档看起来很混乱,是 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 安装,在这种情况下,如果我的语法正确,我会添加到这个答案中。
我正在尝试复制 Matlab 的 interp2 的一些功能。我知道之前有人问过类似的问题,但 none 适用于我的具体情况。
我有一张距离图(可在这个 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)
我用向量 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:\...\AppData\Local\Continuum\Anaconda\lib\site-packages\scipy\interpolate\interpolate.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:\...\AppData\Local\Continuum\Anaconda\lib\site-packages\scipy\interpolate\fitpack.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:\...\AppData\Local\Continuum\Anaconda\lib\site-packages\scipy\interpolate\fitpack2.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 邮件列表 here 上发布的那样,文档看起来很混乱,是 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 安装,在这种情况下,如果我的语法正确,我会添加到这个答案中。