首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >与RectBivariateSpline混淆(x,y)顺序

与RectBivariateSpline混淆(x,y)顺序
EN

Stack Overflow用户
提问于 2016-02-10 14:00:07
回答 1查看 2K关注 0票数 2

我对RectBivariateSpline的论点顺序感到困惑。我正在读取一组2D数据,它的X轴有343个值,Y轴有373个值。读取数据的例程以“正确”的方式返回它,因此当我绘制它时,它是matplotlib,我得到了一个具有正确的物理方向的地图。它还返回343个元素数组中的X值和373个元素数组中的Y值,这是有意义的。

RectBivariateSpline的枕文档给出了如下参数:

代码语言:javascript
运行
复制
scipy.interpolate.RectBivariateSpline(x, y, z)

但是,当我执行

代码语言:javascript
运行
复制
spln = scipy.interpolate.RectBivariateSpline(xval, yval, zval)

我知道这个错误:

代码语言:javascript
运行
复制
TypeError: x dimension of z must have same number of elements as x

我可以通过执行

代码语言:javascript
运行
复制
spln = scipy.interpolate.RectBivariateSpline(yval, xval, zval)

但是现在x和y值是错误的(至少在物理意义上)。这是否意味着x参数指向RectBivariateSpline的第一个数据维度,而不是物理x维度?我习惯于使用Fortran风格的排序中的数据,这可能没有帮助。

对于hpaulj的评论,各种数组的形状为: xval (343,) yval (373,) zval (373,343)

我认为问题是,我混淆了'xy‘和'ij’排序。Matpoltlib似乎在使用'xy‘排序,所以我想我只是需要小心地在使用scipy进行内插时转换ZVAL数组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-10 18:26:36

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

RectBivariateSpline代码的早期,它这样做:

代码语言:javascript
运行
复制
    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 of z (一维)的数量必须与x中的元素数相匹配。

当您显示一个2d数组时,行是第一个维度,向下移动,列是第二个。但是在一个图中,我们通常期望第一个轴-- x轴--穿过页面。

np.meshgrid允许您指定:

索引:{'xy','ij'},可选笛卡尔('xy',默认值)或矩阵('ij')索引输出。有关更多细节,请参见备注。

“xy”索引和“ij”索引之间的区别可能会让您感到困惑。这个样条类使用的是'ij‘类。

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

简单例子

代码语言:javascript
运行
复制
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 ij的对比

代码语言:javascript
运行
复制
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网格构建的。

代码语言:javascript
运行
复制
X,Y=np.meshgrid(x,y,indexing='ij')
Z = X*Y
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35317240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档