scipy interpolate RectBivariateSpline 和 interp2d 的 x,y 参数差异
Difference in x,y parameters for scipy interpolate RectBivariateSpline and interp2d
如果我想插入下面的数据:
from scipy.interpolate import RectBivariateSpline, interp2d
import numpy as np
x1 = np.linspace(0,5,10)
y1 = np.linspace(0,20,20)
xx, yy = np.meshgrid(x1, y1)
z = np.sin(xx**2+yy**2)
与 interp2d
这有效:
f = interp2d(x1, y1, z, kind='cubic')
但是,如果我使用具有相同 x1、y1 参数的 RectBivariateSpline
:
f = RectBivariateSpline(x1, y1, z)
我收到这个错误:
TypeError Traceback (most recent call last)
<ipython-input-9-3da046e1ebe0> in <module>()
----> 1 f = RectBivariateSpline(x, y, z)
C:\...\Local\Continuum\Anaconda\lib\site-packages\scipy\interpolate\fitpack2.pyc in __init__(self, x, y, z, bbox, kx, ky, s)
958 raise TypeError('y must be strictly ascending')
959 if not x.size == z.shape[0]:
--> 960 raise TypeError('x dimension of z must have same number of '
961 'elements as x')
962 if not y.size == z.shape[1]:
TypeError: x dimension of z must have same number of elements as x
我必须像这样切换 x、y 的大小才能让它工作:
x2 = np.linspace(0,5,20)
y2 = np.linspace(0,20,10)
f = RectBivariateSpline(x2, y2, z)
这种行为是否有原因 - 或者我不理解的原因?
嗯,正如您已经注意到的,原因是这两个函数的参数不同。是的,正如我所知,这使得将一个换成另一个真的很难。
为什么?一般来说,打破与新的面向对象样条函数的向后兼容性是一个明确的设计决定,或者至少不用担心。当然,对于较大的网格尺寸,不必将 x 和 y 作为 2D 对象传递,可以显着节省 space 。坦率地说,我在我的代码中发现,一旦克服了这个最初的障碍,我就会更喜欢使用样条对象。例如,对于 UnivariateSpline 对象,求导数很容易,积分也是如此。
SciPy 看来,SciPy 人会关注新对象,因此您可能会考虑现在就转向它们。它们具有相同的基本功能,并且具有提供良好优势的其他方法。
编辑 - 阐明两者之间的 'broke'。
从 interp2d 的 SciPy 手册中,您可以获得代码片段:
from scipy import interpolate
x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)
f = interpolate.interp2d(x, y, z, kind=’cubic’)
不幸的是,这可能会产生误导,因为 x
和 y
的长度相同,因此 z
将是一个方阵。那么,让我们来玩一下:
x = np.linspace(0,5,11)
y = np.linspace(0,20,21) # note different lengths
z = x[None,:].T + y*y # need broadcasting
xx,yy = np.meshgrid(x,y) # this is from the interp2d example to compare
zz = xx + yy*yy
它们现在有不同的形状:shape(z)
是 (11,21) 而 shape(zz)
是 (21,11)。其实就是互相的转置,z
== zz.T
。一旦你意识到这一点,一切都会变得更加清晰 - 从 interp2d
到 RectBivariateSpline
交换了预期的轴。选择样条的一个实例(我选择了较新的样条),并且您已经选择了一组特定的轴以保持头脑清晰。要将它们混合在一起,一个简单的转置也可以工作,但是当您从现在起一个月或更长时间回过头来查看您的代码时,可能会让人头疼。
如果我想插入下面的数据:
from scipy.interpolate import RectBivariateSpline, interp2d
import numpy as np
x1 = np.linspace(0,5,10)
y1 = np.linspace(0,20,20)
xx, yy = np.meshgrid(x1, y1)
z = np.sin(xx**2+yy**2)
与 interp2d
这有效:
f = interp2d(x1, y1, z, kind='cubic')
但是,如果我使用具有相同 x1、y1 参数的 RectBivariateSpline
:
f = RectBivariateSpline(x1, y1, z)
我收到这个错误:
TypeError Traceback (most recent call last)
<ipython-input-9-3da046e1ebe0> in <module>()
----> 1 f = RectBivariateSpline(x, y, z)
C:\...\Local\Continuum\Anaconda\lib\site-packages\scipy\interpolate\fitpack2.pyc in __init__(self, x, y, z, bbox, kx, ky, s)
958 raise TypeError('y must be strictly ascending')
959 if not x.size == z.shape[0]:
--> 960 raise TypeError('x dimension of z must have same number of '
961 'elements as x')
962 if not y.size == z.shape[1]:
TypeError: x dimension of z must have same number of elements as x
我必须像这样切换 x、y 的大小才能让它工作:
x2 = np.linspace(0,5,20)
y2 = np.linspace(0,20,10)
f = RectBivariateSpline(x2, y2, z)
这种行为是否有原因 - 或者我不理解的原因?
嗯,正如您已经注意到的,原因是这两个函数的参数不同。是的,正如我所知,这使得将一个换成另一个真的很难。
为什么?一般来说,打破与新的面向对象样条函数的向后兼容性是一个明确的设计决定,或者至少不用担心。当然,对于较大的网格尺寸,不必将 x 和 y 作为 2D 对象传递,可以显着节省 space 。坦率地说,我在我的代码中发现,一旦克服了这个最初的障碍,我就会更喜欢使用样条对象。例如,对于 UnivariateSpline 对象,求导数很容易,积分也是如此。
SciPy 看来,SciPy 人会关注新对象,因此您可能会考虑现在就转向它们。它们具有相同的基本功能,并且具有提供良好优势的其他方法。
编辑 - 阐明两者之间的 'broke'。
从 interp2d 的 SciPy 手册中,您可以获得代码片段:
from scipy import interpolate
x = np.arange(-5.01, 5.01, 0.25)
y = np.arange(-5.01, 5.01, 0.25)
xx, yy = np.meshgrid(x, y)
z = np.sin(xx**2+yy**2)
f = interpolate.interp2d(x, y, z, kind=’cubic’)
不幸的是,这可能会产生误导,因为 x
和 y
的长度相同,因此 z
将是一个方阵。那么,让我们来玩一下:
x = np.linspace(0,5,11)
y = np.linspace(0,20,21) # note different lengths
z = x[None,:].T + y*y # need broadcasting
xx,yy = np.meshgrid(x,y) # this is from the interp2d example to compare
zz = xx + yy*yy
它们现在有不同的形状:shape(z)
是 (11,21) 而 shape(zz)
是 (21,11)。其实就是互相的转置,z
== zz.T
。一旦你意识到这一点,一切都会变得更加清晰 - 从 interp2d
到 RectBivariateSpline
交换了预期的轴。选择样条的一个实例(我选择了较新的样条),并且您已经选择了一组特定的轴以保持头脑清晰。要将它们混合在一起,一个简单的转置也可以工作,但是当您从现在起一个月或更长时间回过头来查看您的代码时,可能会让人头疼。