这是我上一篇文章的后续问题:Python/Scipy Interpolation (map_coordinates)
假设我想在二维矩形区域内插值。我的变量'z‘包含如下所示的数据。每列都是常量值,但是,数组的每一行可以是不同的值,如下面的注释所示。
from scipy import interpolate
from numpy import array
import numpy as np
# # 0.0000, 0.1750, 0.8170, 1.0000
z = array([[-2.2818,-2.2818,-0.9309,-0.9309], # 0.0000, 0.0000, 0.0000, 0.0000
[-2.2818,-2.2818,-0.9309,-0.9309], # 0.2620, 0.2784, 0.3379, 0.3526
[-1.4891,-1.4891,-0.5531,-0.5531], # 0.6121, 0.6351, 0.7118, 0.7309
[-1.4891,-1.4891,-0.5531,-0.5531]]) # 1.0000, 1.0000, 1.0000, 1.0000
# Rows, Columns = z.shape
cols = array([0.0000, 0.1750, 0.8170, 1.0000])
rows = array([0.0000, 0.2620, 0.6121, 1.0000])
sp = interpolate.RectBivariateSpline(rows, cols, z, kx=1, ky=1, s=0)
xi = np.array([0.00000, 0.26200, 0.27840, 0.33790, 0.35260, 0.61210, 0.63510,
0.71180, 0.73090, 1.00000], dtype=np.float)
yi = np.array([0.000, 0.167, 0.815, 1.000], dtype=np.float)
print sp(xi, yi)
作为可视化的另一种方式,我知道的值数组是:
rows = array([0.0000, 0.2620, 0.2784, 0.3379, 0.3526,
0.6121, 0.6351, 0.7118, 0.7309, 1.0000])
# # 0.0000, 0.1750, 0.8170, 1.0000
z = array([[-2.2818,-2.2818,-0.9309,-0.9309], # 0.0000
[-2.2818, ?, ?, ?], # 0.2620,
[ ?,-2.2818, ?, ?], # 0.2784
[ ?, ?,-0.9309, ?], # 0.3379
[ ? ,?, ?,-0.9309], # 0.3526
[-1.4891, ?, ?, ?], # 0.6121
[ ?,-1.4891, ?, ?], # 0.6351
[ ?, ?,-0.5531, ?], # 0.7118
[ ?, ?, ?,-0.5531], # 0.7309
[-1.4891,-1.4891,-0.5531,-0.5531]]) # 1.0000
我不知道“?”值,并且应该对它们进行插值。我试着将它们替换为None,但是在我所有的结果中都得到了'nan‘。
编辑:
我想我需要使用'griddata‘或'interp2’。网格数据似乎能产生我期望的结果,但'interp2‘不能。
from scipy import interpolate
from numpy import array
import numpy as np
z = array([[-2.2818,-2.2818,-0.9309,-0.9309],
[-2.2818,-2.2818,-0.9309,-0.9309],
[-1.4891,-1.4891,-0.5531,-0.5531],
[-1.4891,-1.4891,-0.5531,-0.5531]])
rows = array([0.0000, 0.0000, 0.0000, 0.0000,
0.2620, 0.2784, 0.3379, 0.3526,
0.6121, 0.6351, 0.7118, 0.7309,
1.0000, 1.0000, 1.0000, 1.0000])
cols = array([0.0000, 0.1750, 0.8180, 1.0000,
0.0000, 0.1750, 0.8180, 1.0000,
0.0000, 0.1750, 0.8180, 1.0000,
0.0000, 0.1750, 0.8180, 1.0000])
xi = array([0.0000, 0.2620, 0.2784, 0.3379, 0.3526, 0.6121, 0.6351, 0.7118,
0.7309, 1.0000], dtype=np.float)
yi = array([0.000, 0.175, 0.818, 1.000], dtype=np.float)
GD = interpolate.griddata((rows, cols), z.ravel(),
(xi[None,:], yi[:,None]), method='linear')
I2 = interpolate.interp2d(rows, cols, z, kind='linear')
print GD.reshape(4, 10).T
print '\n'
print I2(xi, yi).reshape(4, 10).T
import matplotlib.pyplot as plt
import numpy.ma as ma
plt.figure()
GD = interpolate.griddata((rows.ravel(), cols.ravel()), z.ravel(),
(xi[None,:], yi[:,None]), method='linear')
CS = plt.contour(xi,yi,GD,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,GD,15,cmap=plt.cm.jet)
plt.colorbar()
plt.scatter(rows,cols,marker='o',c='b',s=5)
plt.figure()
I2 = I2(xi, yi)
CS = plt.contour(xi,yi,I2,15,linewidths=0.5,colors='k')
CS = plt.contourf(xi,yi,I2,15,cmap=plt.cm.jet)
plt.colorbar()
plt.scatter(rows,cols,marker='o',c='b',s=5)
plt.show()
发布于 2011-03-01 04:49:22
看起来你成功了。
在上面的代码示例和前面的(linked)问题中,您拥有结构化数据。它可以使用RectBivariateSpline
或interp2d
进行插值。这意味着您拥有可以在网格上描述的数据(网格上的所有点都有一个已知值)。网格不一定要有所有相同的dx和dy。(如果所有的dx和dy都相等,你就会有一个规则的网格)
现在,您当前的问题是,如果不是所有的点都是已知的,该怎么办。这就是所谓的非结构化数据。您所拥有的只是一个字段中的一组点。您不能在所有顶点都具有已知值的情况下构建矩形。对于这种类型的数据,您可以使用(就像您所拥有的那样) griddata
或某种风格的BivariateSpline
。
现在选择哪一个?
与结构化RectBivariateSpline
最相似的是一种非结构化BivariateSpline
classes:SmoothBivariateSpline
或LSQBivariateSpline
。如果你想使用样条线来插值数据,请使用这些。这使得您的函数平滑且可微,但您可以获得一个在Z.max()或Z.min()之外摆动的表面。
由于您设置了ky=1
和kx=1
,并且得到的只是结构化数据上的线性插值,因此我个人会从RectBivariateSpline
样条方案切换到interp2d
结构化网格插值方案。我知道文档说它是用于regular grids的,但__doc__
中的示例本身只是结构化的,而不是常规的。
我很好奇,如果你最终切换了,你是否会发现这些方法之间有什么显着的差异。欢迎使用SciPy。
https://stackoverflow.com/questions/5146025
复制相似问题