首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >坐标对的SciPy interp2D

坐标对的SciPy interp2D
EN

Stack Overflow用户
提问于 2016-02-12 18:53:29
回答 4查看 8.8K关注 0票数 9

我正在使用scipy.interpolate.interp2d为一个曲面创建插值函数。然后,我有两个实际数据数组,我想要计算插值点。如果我将这两个数组传递给interp2d函数,我会得到一个包含所有点的数组,而不仅仅是点对。

我的解决方案是将这两个数组压缩到一个坐标对列表中,并在循环中将其传递给插值函数:

代码语言:javascript
复制
f_interp = interpolate.interp2d(X_table, Y_table,Z_table, kind='cubic')

co_ords = zip(X,Y)
out = []
for i in range(len(co_ords)):
    X = co_ords[i][0]
    Y = co_ords[i][1]
    value = f_interp(X,Y)
    out.append(float(value))

我的问题是,有没有更好的(更优雅的,Pythonic式的?)达到同样效果的方法?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-02-12 19:16:15

首先,你可以这样做

代码语言:javascript
复制
for Xtmp,Ytmp in zip(X,Y):
    ...

在你的循环中。或者更好的是,只需

代码语言:javascript
复制
out = [float(f_interp(XX,YY)) for XX,YY in zip(X,Y)]

替换循环。

换句话说,I suggest using interpolate.griddata。它的行为往往比interp2d好得多,并且它接受任意形状的点作为输入。正如你所看到的,interp2d插值器将只返回网格上的值。

票数 1
EN

Stack Overflow用户

发布于 2016-02-13 04:29:44

一次传递所有的点可能比在Python中循环它们快得多。您可以使用scipy.interpolate.griddata

代码语言:javascript
复制
Z = interpolate.griddata((X_table, Y_table), Z_table, (X, Y), method='cubic')

或一个scipy.interpolate.BivariateSpline类,例如SmoothBivariateSpline

代码语言:javascript
复制
itp = interpolate.SmoothBivariateSpline(X_table, Y_table, Z_table)
# NB: choose grid=False to get an (n,) rather than an (n, n) output
Z = itp(X, Y, grid=False)

CloughTocher2DInterpolator也以类似的方式工作,但没有grid=False参数(它始终返回1D输出)。

票数 4
EN

Stack Overflow用户

发布于 2016-02-12 19:24:21

尝试*args和tuple打包/解包

代码语言:javascript
复制
points = zip(X, Y)
out = []
for p in points:
    value = f_interp(*p)
    out.append(float(value))

或者只是

代码语言:javascript
复制
points = zip(X, Y)
out = [float(f_interp(*p)) for p in points]

或者只是

代码语言:javascript
复制
out = [float(f_interp(*p)) for p in zip(X, Y)]

顺便说一句,“魔法之星”允许zip是它自己的反转!

代码语言:javascript
复制
points = zip(x, y)
x, y   = zip(*points)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35360756

复制
相关文章

相似问题

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