我在scipy中使用griddata函数对3维和4维数据进行插值。它像一个冠军一样工作,除了它返回一堆NaN,因为我需要的某些点不在输入数据的范围之内。鉴于N-d数据无论如何都只能在“线性”模式内插下工作,因此让griddata进行外插而不是仅仅返回NaN应该是很容易的。有没有人这样做或找到了解决方法?需要说明的是:我具有非结构化数据,因此无法使用任何需要常规网格的函数。
谢谢!
亚历克斯

最佳答案

scipy.interpolate.Rbf插值和外推3、4或实际上任何维度的数据的一种可能性
为了方便起见,get_data()函数和plot_3d()函数附加到末尾。
示例数据
示例数据看起来像这样(第四维w用一种颜色显示)。数据间隔不规则且未网格化。
python - python中的3D外推法(基本上,scipy.griddata扩展为外推法)-LMLPHP

x, y, z, w = get_data(N=200)
plot_3d(x, y, z, w)
3D内插和外推
首先,让我们设置新的x和y坐标。为了使这个更有趣,让我们外推到负x和负y方向。这形成了新的感兴趣的x和y范围。
xs = np.linspace(-10, 20) # some extrapolation to negative numbers
ys = np.linspace(-10, 20) # some extrapolation to negative numbers
xnew, ynew = np.meshgrid(xs, ys)
xnew = xnew.flatten()
ynew = ynew.flatten()
scipy.interpolate.Rbf进行插值。现在,
from scipy.interpolate import Rbf
rbf3 = Rbf(x, y, z, function="multiquadric", smooth=5)
znew = rbf3(xnew, ynew)

plot_3d(xnew, ynew, znew)
  • 可以根据需要选择任意数量的变量/尺寸。第一个参数(xy)被视为节点的坐标。 function参数之前的最后一个参数是要插值的“值”(现在为z)。
  • function参数可用于控制如何对值进行插值。这会影响结果,因此请使用它来处理您的数据。
  • smooth参数可用于消除数据中的某些噪声。如果smooth为零,则结果为插值;否则为0。它将遍历您的所有数据点。如果为正值,则数据更平滑。这会影响结果,因此请使用它来处理您的数据。
  • 以下是结果,推断当然不正确。这只是为了证明外推是可能的。您可能需要微调functionsmooth以获得所需的结果。通常,不应将数据外推“太多”(如本例所示)

  • python - python中的3D外推法(基本上,scipy.griddata扩展为外推法)-LMLPHP
    增加第四维
    也可以内插和外推到第四维。方法如下:
    rbf4 = Rbf(x, y, z, w, function="thin_plate", smooth=5)
    wnew = rbf4(xnew, ynew, znew)
    plot_3d(xnew, ynew, znew, wnew)
    
  • 我为第四个维度创建了另一个Rbf实例,并使用通过znew(在3d中进行插值)计算出的rbf3
  • 我将function更改为"thin_plate",因为从外观上看,此数据集的性能更好。
  • 这是结果的样子:
    python - python中的3D外推法(基本上,scipy.griddata扩展为外推法)-LMLPHP

  • 附录:get_dataplot_3d出于测试目的:
    import numpy as np
    
    def get_data():
        np.random.seed(100)
        N = 200
        maxval = 20
        x = np.random.random(N) * maxval
        y = np.random.random(N) * maxval
        z = x ** 2 + np.sqrt(y) * y - y ** 3 + np.random.random(N) + 18 * y ** 2 * 2
        w = x ** 2 - np.log(y + (x * y) ** 2)
        return x, y, z, w
    
    
    def plot_3d(x, y, z, w=None, show=True):
        import matplotlib.pyplot as plt
        from mpl_toolkits.mplot3d import axes3d
    
        fig = plt.figure(figsize=(10, 6))
        ax = axes3d.Axes3D(fig)
        ax.scatter3D(x, y, z, c=w if not w is None else "b")
        plt.show()
    

    关于python - python中的3D外推法(基本上,scipy.griddata扩展为外推法),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11214118/

    10-12 23:05