1

!我有 (x,y,z) 形式的值。通过创建一个 list_plot3d 图,我可以清楚地看到它们的间距不是很均匀。它们通常在 xy 平面上形成 3 到 5 个点的小“斑点”。因此,为了使插值和最终的“轮廓”图更好,或者我应该说更平滑(?),我是否必须创建一个矩形网格(如棋盘上的正方形),以便数据块以某种方式“平滑”?我知道这对某些人来说可能是微不足道的,但我是第一次尝试这个,我有点挣扎。我一直在查看像 scipy.interplate.interp2d 这样的 scipy 包,但最后生成的图表非常糟糕。对于像我这样的业余爱好者来说,也许是一个关于 sagemath 中 2d 插值的简短教程?一些忠告?谢谢你。

编辑:

https://docs.google.com/file/d/0Bxv8ab9PeMQVUFhBYWlldU9ib0E/edit?pli=1

这主要是它与此消息一起生成的图表类型:

Warning:     No more knots can be added because the number of B-spline
coefficients
    already exceeds the number of data points m. Probably causes:
either
    s or m too small. (fp>s)
    kx,ky=3,3 nx,ny=17,20 m=200 fp=4696.972223 s=0.000000

要获取此图,我只需运行以下命令:

f_interpolation = scipy.interpolate.interp2d(*zip(*matrix(C)),kind='cubic')
               plot_interpolation = contour_plot(lambda x,y:
                   f_interpolation(x,y)[0], (22.419,22.439),(37.06,37.08) ,cmap='jet', contours=numpy.arange(0,1400,100), colorbar=True)

               plot_all = plot_interpolation

               plot_all.show(axes_labels=["m", "m"])

矩阵(c)可以是一个巨大的矩阵,如 10000 X 3 甚至更像 1000000 x 3。即使数据较少,如我现在附上的图片,矩阵(C)只有 200 x 3 的情况下,坏图的问题仍然存在. 这就是为什么我开始认为除了程序可能出现故障之外,我使用此命令的方法可能完全错误,因此我有理由寻求有关使用网格的建议,而不仅仅是“将我的数据投入到命令中。

4

1 回答 1

3

我在使用 scipy.interpolate.interp2d 函数时遇到了类似的问题。我的理解是,问题的出现是因为 interp1d/interp2d 和相关函数使用旧的 FITPACK 包装进行基础计算。我能够使用样条函数解决与您类似的问题,该函数依赖于更新的 FITPACK 包装。可以识别样条函数,因为它们的名称中似乎都有大写字母http://docs.scipy.org/doc/scipy/reference/interpolate.html。在 scipy 安装中,这些较新的函数似乎位于 scipy/interpolate/fitpack2.py 中,而使用旧包装的函数位于 fitpack.py 中。

出于您的目的, RectBivariateSpline 是我相信您想要的。下面是一些用于实现 RectBivariateSpline 的示例代码:

import numpy as np
from scipy import interpolate

# Generate unevenly spaced x/y data for axes
npoints = 25
maxaxis = 100
x = (np.random.rand(npoints)*maxaxis) - maxaxis/2.
y = (np.random.rand(npoints)*maxaxis) - maxaxis/2.
xsort = np.sort(x)
ysort = np.sort(y)

# Generate the z-data, which first requires converting
# x/y data into grids
xg, yg = np.meshgrid(xsort,ysort)
z = xg**2 - yg**2

# Generate the interpolated, evenly spaced data
# Note that the min/max of x/y isn't necessarily 0 and 100 since
# randomly chosen points were used. If we want to avoid extrapolation,
# the explicit min/max must be found
interppoints = 100
xinterp = np.linspace(xsort[0],xsort[-1],interppoints)
yinterp = np.linspace(ysort[0],ysort[-1],interppoints)

# Generate the kernel that will be used for interpolation
# Note that the default version uses three coefficients for
# interpolation (i.e. parabolic, a*x**2 + b*x +c). Higher order
# interpolation can be used by setting kx and ky to larger 
# integers, i.e. interpolate.RectBivariateSpline(xsort,ysort,z,kx=5,ky=5)
kernel = interpolate.RectBivariateSpline(xsort,ysort,z)

# Now calculate the linear, interpolated data
zinterp = kernel(xinterp, yinterp)
于 2012-07-16T15:17:51.470 回答