【问题标题】:Interpolation of 2D scattered non-uniform data numpy/scipy2D 分散非均匀数据 numpy/scipy 的插值
【发布时间】:2016-06-17 12:18:24
【问题描述】:

我有一个如下所示的数据文件:

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)。

我分别用Rzalpha作为xyz尝试了以下操作:

  1. z 设置为二维数组,并将所有缺失值设置为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 插值的最佳方法是什么?

【问题讨论】:

  • 与其向我们展示您的数据文件是如何组织的,不如展示您的实际Rzalpha 变量的样本会更有用。

标签: python numpy scipy interpolation


【解决方案1】:

RectBivariateSpline is for uniform grids only,所以你不能使用它。

否则,听起来您可能只是错误地输入了数据——但我们无法判断,因为您没有向我们展示代码的关键部分。对于不规则网格,x, y, z 输入到interp2d 应该具有相同的点数。你的输入是真的吗? (就在您致电interp2d 之前,打印x.size 等)如果这不能告诉您您做错了什么,请编辑您的问题以显示minimal, complete, and verifiable example

【讨论】:

    【解决方案2】:

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

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

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

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

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

    • values 参数应为alpha

    • points 应该是一个 (n, 2) 数组,由串联在一起的 Rz 向量组成。

    • 您还需要指定xi,它对应于计算插值的点(即您的“xnew,ynew”值)。这不是alpha一样的东西!


    正如@Mike 所提到的,RectBivariateSpline 仅适用于常规网格(interp2d 也是如此),您当然无法通过仅用 NaN 填充缺失值来解决此限制。

    【讨论】:

    • 您好,感谢您的评论。你说得对,我的问题的形式是 alpha=f(R,z)。但是每个 R 的 z 值集合是不同的。所以我不确定如何将 z 和 alpha 作为一维数组?谢谢。
    • 我不明白您所说的“每个 R 的 z 值集”是什么意思。为了使插值有意义,alpha 中的每个值都必须与R 中的单个值和z 中的单个值相关联。也许您的Rz 值毕竟在某种网格上?正如我所说,如果不查看实际的 Rzalpha 数组的样子,就很难理解发生了什么。
    • 嗯。 interp2d documentation 表明它能够处理不规则网格。我得到了合理的结果。
    • dropbox.com/s/5yjrrhjqtg6awjc/disk2d.z?dl=0 这是 z 网格的文件。第一列是 R 值,第二列是指定特定 R 存在的 z 值数量的整数。dropbox.com/s/fda6rwfxm1x3vww/disk2d.alpha?dl=0 alpha 的文件以相同的方式。第一列是 R,第二列是每个 R 的 alpha 值的数量,与 z 相同。
    猜你喜欢
    • 2011-07-05
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2014-03-26
    • 2018-02-06
    • 2014-11-12
    • 2013-12-27
    相关资源
    最近更新 更多