我正在使用scipy.interpolate.interp2d
为一个曲面创建插值函数。然后,我有两个实际数据数组,我想要计算插值点。如果我将这两个数组传递给interp2d
函数,我会得到一个包含所有点的数组,而不仅仅是点对。
我的解决方案是将这两个数组压缩到一个坐标对列表中,并在循环中将其传递给插值函数:
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式的?)达到同样效果的方法?
发布于 2016-02-12 19:16:15
首先,你可以这样做
for Xtmp,Ytmp in zip(X,Y):
...
在你的循环中。或者更好的是,只需
out = [float(f_interp(XX,YY)) for XX,YY in zip(X,Y)]
替换循环。
换句话说,I suggest using interpolate.griddata
。它的行为往往比interp2d
好得多,并且它接受任意形状的点作为输入。正如你所看到的,interp2d
插值器将只返回网格上的值。
发布于 2016-02-13 04:29:44
一次传递所有的点可能比在Python中循环它们快得多。您可以使用scipy.interpolate.griddata
Z = interpolate.griddata((X_table, Y_table), Z_table, (X, Y), method='cubic')
或一个scipy.interpolate.BivariateSpline
类,例如SmoothBivariateSpline
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输出)。
发布于 2016-02-12 19:24:21
尝试*args和tuple打包/解包
points = zip(X, Y)
out = []
for p in points:
value = f_interp(*p)
out.append(float(value))
或者只是
points = zip(X, Y)
out = [float(f_interp(*p)) for p in points]
或者只是
out = [float(f_interp(*p)) for p in zip(X, Y)]
顺便说一句,“魔法之星”允许zip是它自己的反转!
points = zip(x, y)
x, y = zip(*points)
https://stackoverflow.com/questions/35360756
复制相似问题