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