使用RectBivariateSpline对(x,y)顺序感到困惑

时间:2016-02-10 14:00:08

标签: numpy scipy

我对i & (1 << j)的参数顺序感到困惑。我正在读取一组2D数据,其沿X轴具有343个值,沿Y轴具有373个值。读取数据的例程以“正确”的意义返回它,这样当我绘制matplotlib时,我得到一个具有正确物理方向的地图。它还返回343个元素的数组中的X值和373个元素的数组中的Y值,这是有意义的。

RectBivariateSpline的scipy文档给出的参数为:

RectBivariateSpline

然而,当我执行

scipy.interpolate.RectBivariateSpline(x, y, z)

我收到此错误:

spln = scipy.interpolate.RectBivariateSpline(xval, yval, zval)

我可以通过执行

删除错误
TypeError: x dimension of z must have same number of elements as x

但是现在x和y的值是错误的方式(至少在物理意义上)。这是否意味着spln = scipy.interpolate.RectBivariateSpline(yval, xval, zval) 的{​​{1}}参数是指数据集的第一个数据维度而不是物理x维度?我习惯于使用Fortran式排序的数据,这可能没有帮助。

在回答hpaulj的评论时,各种数组的形状是:     xval(343,)     yval(373,)     zval(373,343)

我认为问题在于我在'xy'和'ij'排序之间感到困惑。 Matpoltlib似乎使用'xy'排序,所以我想在使用scipy进行插值时我需要小心转置ZVAL数组

1 个答案:

答案 0 :(得分:0)

向我们展示xval.shapeyval.shapezval.shape

的值

早期RectBivariateSpline代码确实:

    x, y = ravel(x), ravel(y)
    ....
    if not x.size == z.shape[0]:
        raise TypeError('x dimension of z must have same number of '
                        'elements as x')
    if not y.size == z.shape[1]:
        raise TypeError('y dimension of z must have same number of '
                        'elements as y')

因此rows(第一维)z的数量必须与x中的元素数相匹配。

当您显示二维数组时,行是第一维,沿着页面向下,第二列是第二维。但是在情节中,我们经常期望第一个轴x穿过页面。

np.meshgrid可让您指定:

indexing : {'xy', 'ij'}, optional
    Cartesian ('xy', default) or matrix ('ij') indexing of output.
    See Notes for more details.

&#39; xy&#39;之间的区别索引和&#39; ij&#39;索引可能会使您感到困惑。此Spline课程正在使用&#39; ij&#39;样。

切换xy的替代方法是使用zz.T的转置。请记住,插值点遵循相同的排序规则。

简单示例

In [30]: x=np.arange(10)

In [31]: y=np.arange(15)

In [32]: z=x[:,None]*y[None,:]

In [33]: S=interpolate.RectBivariateSpline(x,y,z)

In [34]: S([1,2,3],[4,5,6])
Out[34]: 
array([[  4.,   5.,   6.],
       [  8.,  10.,  12.],
       [ 12.,  15.,  18.]])

对比meshgrid中的xy v ij:

In [37]: np.meshgrid(x,y)[0].shape
Out[37]: (15, 10)

In [38]: np.meshgrid(x,y,indexing='ij')[0].shape
Out[38]: (10, 15)

z可以从ij网格构建。

X,Y=np.meshgrid(x,y,indexing='ij')
Z = X*Y