我对RectBivariateSpline
的论点顺序感到困惑。我正在读取一组2D数据,它的X轴有343个值,Y轴有373个值。读取数据的例程以“正确”的方式返回它,因此当我绘制它时,它是matplotlib,我得到了一个具有正确的物理方向的地图。它还返回343个元素数组中的X值和373个元素数组中的Y值,这是有意义的。
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
我可以通过执行
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数组。
发布于 2016-02-10 18:26:36
向我们展示xval.shape
、yval.shape
和zval.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
of z
(一维)的数量必须与x
中的元素数相匹配。
当您显示一个2d数组时,行是第一个维度,向下移动,列是第二个。但是在一个图中,我们通常期望第一个轴-- x
轴--穿过页面。
np.meshgrid
允许您指定:
索引:{'xy','ij'},可选笛卡尔('xy',默认值)或矩阵('ij')索引输出。有关更多细节,请参见备注。
“xy”索引和“ij”索引之间的区别可能会让您感到困惑。这个样条类使用的是'ij‘类。
切换x
和y
的另一种方法是使用z
,z.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 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
https://stackoverflow.com/questions/35317240
复制相似问题