Python 利用径向基函数外推网格数据

Python 利用径向基函数外推网格数据,python,numpy,grid,extrapolation,Python,Numpy,Grid,Extrapolation,我有一些间距相当大的测量数据,我用numpy的Griddata绘制了等高线图。Griddata与实际测量的零件有很好的相关性。我希望在测量点之外再进一步推断网格数据。我已经研究了使用RBF和interp2D,但是,这两种方法从根本上改变了轮廓轮廓 是否有方法提取网格数据(x、y、z)坐标并将其输入RBF函数,以便轮廓延伸,并在一定程度上保持网格数据插值?还是有其他更好的方法 我尝试了不同的方法来获取griddata,主要是从这个答案,但没有成功。 http://stackoverflow.com

我有一些间距相当大的测量数据,我用numpy的Griddata绘制了等高线图。Griddata与实际测量的零件有很好的相关性。我希望在测量点之外再进一步推断网格数据。我已经研究了使用RBF和interp2D,但是,这两种方法从根本上改变了轮廓轮廓

是否有方法提取网格数据(x、y、z)坐标并将其输入RBF函数,以便轮廓延伸,并在一定程度上保持网格数据插值?还是有其他更好的方法

我尝试了不同的方法来获取griddata,主要是从这个答案,但没有成功。 http://stackoverflow.com/questions/34489039/从scipy interpolate griddata检索数据点

以下是我的代码(Python 3.4.3):

下面是结果的Griddata和RBF图。

经过多次修改,我终于找到了答案(使用我发布的原始链接)。这可能不是最好的,但它成功了。我仍然必须确保我的新高度数组中没有任何“屏蔽”数据。这是我的新代码:

from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy as np
import scipy.interpolate as interp

#data points
x=[20,20,20,20,20,20,0,0,0,0,0,0,-20,-20,-20,-20,-20,-20]
y=[59,27,16,-16,-27,-59,59,27,16,-16,-27,-59,59,27,16,-16,-27,-59]
z=[0.212,0.2099,0.2097,0.2099,0.21,0.213,0.2117,0.209,0.2084,0.2085,0.2086,0.2113,0.2128,0.21,0.2098,0.2094,0.21,0.2114]

# define grid.
xi = np.linspace(-20, 20, 21)
yi = np.linspace(-59, 59, 21)
# grid the data.
zi = griddata(x, y, z, xi, yi, interp='linear')

#from http:// stackoverflow.com/questions/34489039/ retrieving-data-points-from-scipy-interpolate-griddata
xi_coords = {value: index for index, value in enumerate(xi)}
yi_coords = {value: index for index, value in enumerate(yi)}


#iterate to find all the griddata z-height values
zii = []

for index, value in enumerate(xi):
    for index, value2 in enumerate(yi):
        zii.append(zi[xi_coords[value],yi_coords[value2]])

#RBF Method
xi,yi=np.meshgrid(xi, yi)
RBFi = interp.Rbf(xi, yi, zii, function='quintic', smooth=0)
# re-grid the data to fit the entire graph
xi = np.linspace(-25, 25, 151)
yi = np.linspace(-65, 65, 151)
xi,yi=np.meshgrid(xi, yi)
zi = RBFi(xi, yi)



plt.figure(num=None, figsize=(9.95, 16.712), dpi=80, facecolor='w', edgecolor='k')
# contour the gridded data, plotting dots at the nonuniform data points.
CS = plt.contour(xi, yi, zi, 30, linewidths=0.5, colors='k')
CS = plt.contourf(xi, yi, zi, 50, cmap=plt.cm.rainbow)
plt.colorbar()  # draw colorbar
# plot data points.
plt.scatter(x, y, marker='o', c='b', s=5, zorder=10)
plt.xlim(-25, 25)
plt.ylim(-65, 65)

plt.show()
from matplotlib.mlab import griddata
import matplotlib.pyplot as plt
import numpy as np
import scipy.interpolate as interp

#data points
x=[20,20,20,20,20,20,0,0,0,0,0,0,-20,-20,-20,-20,-20,-20]
y=[59,27,16,-16,-27,-59,59,27,16,-16,-27,-59,59,27,16,-16,-27,-59]
z=[0.212,0.2099,0.2097,0.2099,0.21,0.213,0.2117,0.209,0.2084,0.2085,0.2086,0.2113,0.2128,0.21,0.2098,0.2094,0.21,0.2114]

# define grid.
xi = np.linspace(-20, 20, 21)
yi = np.linspace(-59, 59, 21)
# grid the data.
zi = griddata(x, y, z, xi, yi, interp='linear')

#from http:// stackoverflow.com/questions/34489039/ retrieving-data-points-from-scipy-interpolate-griddata
xi_coords = {value: index for index, value in enumerate(xi)}
yi_coords = {value: index for index, value in enumerate(yi)}


#iterate to find all the griddata z-height values
zii = []

for index, value in enumerate(xi):
    for index, value2 in enumerate(yi):
        zii.append(zi[xi_coords[value],yi_coords[value2]])

#RBF Method
xi,yi=np.meshgrid(xi, yi)
RBFi = interp.Rbf(xi, yi, zii, function='quintic', smooth=0)
# re-grid the data to fit the entire graph
xi = np.linspace(-25, 25, 151)
yi = np.linspace(-65, 65, 151)
xi,yi=np.meshgrid(xi, yi)
zi = RBFi(xi, yi)



plt.figure(num=None, figsize=(9.95, 16.712), dpi=80, facecolor='w', edgecolor='k')
# contour the gridded data, plotting dots at the nonuniform data points.
CS = plt.contour(xi, yi, zi, 30, linewidths=0.5, colors='k')
CS = plt.contourf(xi, yi, zi, 50, cmap=plt.cm.rainbow)
plt.colorbar()  # draw colorbar
# plot data points.
plt.scatter(x, y, marker='o', c='b', s=5, zorder=10)
plt.xlim(-25, 25)
plt.ylim(-65, 65)

plt.show()