我需要一个相当于interp2MATLAB函数的Python。我试图让这个MATLAB的例子在Python中工作,但我做不到。
import numpy as np
from scipy.interpolate import interp2d
from scipy.interpolate import RectBivariateSpline
service = np.array(range(10, 31, 10))
years = np.array(range(1950, 1991, 10))
wage = np.array([[150.6970,199.5920,187.6250],
[179.3230, 195.0720, 250.2870],
[203.2120, 179.0920, 322.7670],
[226.5050, 153.7060, 426.7300],
[249.6330, 120.2810, 598.2430]])
ip = RectBivariateSpline(years, service, wage)
print(ip(15, 1975))
但我得到了这个错误(在RectBivariateSpline中),我无法解决:
Traceback (most recent call last):
File "/Users/andrea/Documents/workspace/PythonProjects/pyArmBot/src/foo.py", line 15, in <module>
ip = RectBivariateSpline(years, service, wage)
File "/Library/Python/2.7/site-packages/scipy-0.10.1-py2.7-macosx-10.7-intel.egg/scipy/interpolate/fitpack2.py", line 728, in __init__
kx,ky,s)
我认为您需要调用ip,通过使用以下行而不是打印行来返回值。
print(ip.ev(15, 1975))
更新:
很容易调整。一直盯着我的脸。您可以设置kx和ky的值,这是二元样条曲线的度数。请参阅此处的文档
无论如何,只需将行调整为:
ip = RectBivariateSpline(years, service, wage, kx=2, ky=2)
如果你不想的话,你不需要调整kx。我怀疑如果你把kx保留为3,它会对插值有很大的改变。
blueSurfer,我认为按照您设置插值的方式,ip(1975, 15)
将获得正确的结果,而不是相反。
我遇到了同样的问题,并发现scipy.ndimage.map_coordinates
与Vq = interp2(V,Xq,Yq)
的作用相同。请阅读这些命令的文档,以找到适合您的案例的解决方案。
在Matlab的Vq = interp2(V,Xq,Yq)
:中试试这个
Vq = scipy.ndimage.map_coordinates(V, [Xq.ravel(), Yq.ravel()], order=3, mode='nearest').reshape(V.shape)