二维散射非均匀数据numpy/scipy的插值



我有一个数据文件,看起来像这样:

1.0  2.1  2.4  3.0  3.1  3.2  3.7  3.9  4.2
1.3  1.6  1.8  1.9  2.8  2.9  3.7  3.9  4.0  4.4  4.7  4.9 
1.4  0.4  0.5  1.5  1.8  2.2  2.5  2.8  2.9  3.6
1.8  1.1  1.3  1.9  2.1  2.8  3.7  3.9  4.0  4.2  4.7  4.9  5.2  5.8
2.1  0.2  0.3  1.1  1.4  1.6  1.9 

这里的第一列对应于 x 值(不均匀间隔),对于每个 x 值,该行中的其余数据是 y 值。我知道每行中 y 值的数量。原始数据文件有 200 个这样的行。对于这些 xs 和 ys 中的每一个,我都有 z(x,y)。现在我想对新网格进行 2D 插值,如下所示:

1.1  1.0  2.2  2.4
1.3  1.1  1.3  2.0  2.2
1.7  1.2  1.5  2.0  2.4
1.9  1.4  1.5  1.8  2.0  2.2  2.4
(40 such rows)

等等。这里和以前一样,第一列是 x(xnew) 值,行中的所有剩余元素都是 y(ynew) 值,没有一个是均匀间隔的。我必须找到znew(xnew,ynew)。

我已经尝试了以下事情,分别R zalpha x yz

  1. z设置为 2D 数组,并将所有缺失值设置为 nan 。使用interpolate.interp2d .它说,

    No more knots can be added because the number of B-spline coefficients
        already exceeds the number of data points m. Probably causes: either
        s or m too small. (fp>s)
        kx,ky=1,1 nx,ny=128,129 m=16000 fp=nan s=0.000000
    and znew has only 0 or nan as values.
    
  2. f1=interpolate.griddata(R,z,alpha,method='linear')

    QH6154 qhull precision error: initial facet 1 is coplanar with the interior
    point
    ERRONEOUS FACET:
    
  3. f1=interpolate.RectBivariateSpline(R,z,alpha)它给出了一个错误。

对此数据执行 2D 插值的最佳方法是什么?

RectBivariateSpline仅适用于统一网格,因此您不能使用它。

否则,听起来您可能只是错误地输入了数据 - 但我们无法判断,因为您没有向我们展示代码的关键部分。 对于不规则网格,interp2dx, y, z输入应具有相同的点数。 您的输入是这样吗? (就在你打电话interp2d之前,打印x.size等) 如果这没有显示您做错了什么,请编辑您的问题以显示最小、完整且可验证的示例。

您对griddata的调用不正确。语法是 griddata(points, values, xi, ...) ,其中:

points : 浮点数的数组,形状(n,D)数据点坐标。能 可以是形状数组 (n, D),也可以是 ndim 数组的元组。

values : 浮点数或复数形状 (n,) 数据值的数组。

xi : 浮点数、形状 (M, D) 的数组,用于插值的点 数据。

如果我正确理解您的描述,您尝试插值的函数具有 alpha = f(R, z) 形式,以便Rz指定对alpha值进行采样的坐标。 Rzalpha都应该是相同长度的一维向量。如果这种解释是正确的,那么

  • values参数应alpha

  • points应该是一个(n, 2)数组,由R和连接在一起的z向量组成。

  • 您还需要指定 xi ,它对应于要计算插值的点(即您的"xnew,ynew"值)。这和alpha不是一回事!


正如@Mike提到的,RectBivariateSpline仅适用于常规网格(如interp2d),您当然无法通过仅用 NaN 填充缺失值来绕过此约束。

最新更新