Numpy 用矩形二元样条线混淆(x,y)阶

Numpy 用矩形二元样条线混淆(x,y)阶,numpy,scipy,Numpy,Scipy,我对矩形双变量样条线的参数顺序感到困惑。我正在读取一组二维数据,沿X轴有343个值,沿Y轴有373个值。读取数据的例程以“正确”的方式返回数据,这样,当我将其绘制为matplotlib时,就会得到具有正确物理方向的贴图。它还返回343个元素数组中的X值和373个元素数组中的Y值,这很有意义 RectBivariateSpline的scipy文档给出了如下参数: scipy.interpolate.RectBivariateSpline(x, y, z) 然而,当我执行 spln = scipy

我对
矩形双变量样条线的参数顺序感到困惑。我正在读取一组二维数据,沿X轴有343个值,沿Y轴有373个值。读取数据的例程以“正确”的方式返回数据,这样,当我将其绘制为matplotlib时,就会得到具有正确物理方向的贴图。它还返回343个元素数组中的X值和373个元素数组中的Y值,这很有意义

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

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值是错误的(至少在物理意义上)。这是否意味着
RectBivariateSpline
x
参数指的是数据集的第一个数据维度,而不是物理
x
维度?我习惯于用Fortran风格的顺序处理数据,这可能没有什么帮助

针对hpaulj的评论,各种阵列的形状如下: xval(343,) 伊瓦尔(373,) 兹瓦尔(373343)


我认为问题在于我对“xy”和“ij”排序感到困惑。Matpoltlib似乎在使用“xy”排序,所以我想在使用scipy插值时,我只需要小心地转置ZVAL数组,向我们显示
xval.shape
yval.shape
ZVAL.shape

矩形双变量样条线的早期
代码中:

    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')
因此
z
(第一维度)的
行数必须与
x
中的元素数匹配

显示二维阵列时,行是第一个维度,向下是页面,列是第二个维度。但在绘图中,我们通常期望第一个轴,即
x
轴穿过页面

np.meshgrid
用于指定:

“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.]])
对比
网格中的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

你能发布一些数据吗?可能只是复制问题的简化数据集。
X,Y=np.meshgrid(x,y,indexing='ij')
Z = X*Y