首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python中的3D Extrapolation (基本上,scipy.griddata扩展为extrapolate)

python中的3D Extrapolation (基本上,scipy.griddata扩展为extrapolate)
EN

Stack Overflow用户
提问于 2012-06-27 02:54:01
回答 2查看 4.9K关注 0票数 7

我正在使用scipy中的griddata函数来插值3维和4维数据。它的工作方式类似于champ,只不过它返回一堆NaN,因为我需要的一些点不在输入数据的范围内。考虑到N-d数据只适用于“线性”模式插值,让griddata进行外推而不只是返回NaN应该是小菜一碟。有没有人这样做过或找到了解决办法?需要说明的是:我有非结构化的数据,所以我不能使用任何需要常规网格的函数。谢谢!亚历克斯

EN

回答 2

Stack Overflow用户

发布于 2020-12-05 05:31:15

使用scipy.interpolate.Rbf可以对3维、4维或实际上任何维度的数据进行插值和外推

为方便起见,末尾附加了get_data()函数和plot_3d()函数。

示例数据

示例数据如下所示(第四维,w,用颜色显示)。数据的间距是不规则的,并且不是网格。

代码语言:javascript
复制
x, y, z, w = get_data(N=200)
plot_3d(x, y, z, w)

3d中的插值和外推

首先,让我们设置新的x和y坐标。为了使这更有趣,让我们外推到负x和负y方向。这形成了新的感兴趣的x和y范围。

代码语言:javascript
复制
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进行插值。现在,

代码语言:javascript
复制
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).
  • The function参数来控制如何内插值。这将影响结果,因此可以使用它来处理数据。
  • smooth参数可用于平滑数据中的一些噪声。如果smooth为零,则结果是插值;它将遍历所有数据点。如果它是正值,则数据更平滑。这将影响结果,所以使用它来处理您的数据。
  • 下面是结果,推断当然是错误的。这只是为了证明外推是可能的。您可能希望微调functionsmooth以获得所需的结果。通常,不应对数据进行“过多”推断(如本例中所示)

添加第四个维度

也可以内插和外推到第四维。下面是如何实现的:

代码语言:javascript
复制
rbf4 = Rbf(x, y, z, w, function="thin_plate", smooth=5)
wnew = rbf4(xnew, ynew, znew)
plot_3d(xnew, ynew, znew, wnew)

  • 我为第四个维度创建了另一个Rbf实例,并使用了通过rbf3计算的znew (3D插值)。
  • 我将function更改为"thin_plate",因为使用此dataset.
  • Here似乎在视觉上执行得更好结果是这样的:<代码>H240<代码>F241

附录:get_dataplot_3d

出于测试目的:

代码语言:javascript
复制
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()
票数 1
EN

Stack Overflow用户

发布于 2012-07-07 13:51:18

不太确定这是否适用于你,它还不可用,但在numpy的开发版本中有一个'pad‘数组函数……

https://github.com/numpy/numpy/blob/master/numpy/lib/arraypad.py

其中一个选项是'linear_ramp‘,它从边缘值开始向外推算(焊盘),并线性增加/减少到指定的结束值。

它是一个纯粹的python函数,所以你可以把它复制到你的path中然后导入(我还没有测试过)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11214118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档