首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python/Scipy 2D插值(非均匀数据)

Python/Scipy 2D插值(非均匀数据)
EN

Stack Overflow用户
提问于 2011-03-01 02:30:31
回答 1查看 33.8K关注 0票数 17

这是我上一篇文章的后续问题:Python/Scipy Interpolation (map_coordinates)

假设我想在二维矩形区域内插值。我的变量'z‘包含如下所示的数据。每列都是常量值,但是,数组的每一行可以是不同的值,如下面的注释所示。

代码语言:javascript
复制
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)

作为可视化的另一种方式,我知道的值数组是:

代码语言:javascript
复制
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‘不能。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-01 04:49:22

看起来你成功了。

在上面的代码示例和前面的(linked)问题中,您拥有结构化数据。它可以使用RectBivariateSplineinterp2d进行插值。这意味着您拥有可以在网格上描述的数据(网格上的所有点都有一个已知值)。网格不一定要有所有相同的dx和dy。(如果所有的dx和dy都相等,你就会有一个规则的网格)

现在,您当前的问题是,如果不是所有的点都是已知的,该怎么办。这就是所谓的非结构化数据。您所拥有的只是一个字段中的一组点。您不能在所有顶点都具有已知值的情况下构建矩形。对于这种类型的数据,您可以使用(就像您所拥有的那样) griddata或某种风格的BivariateSpline

现在选择哪一个?

与结构化RectBivariateSpline最相似的是一种非结构化BivariateSpline classesSmoothBivariateSplineLSQBivariateSpline。如果你想使用样条线来插值数据,请使用这些。这使得您的函数平滑且可微,但您可以获得一个在Z.max()或Z.min()之外摆动的表面。

由于您设置了ky=1kx=1,并且得到的只是结构化数据上的线性插值,因此我个人会从RectBivariateSpline样条方案切换到interp2d结构化网格插值方案。我知道文档说它是用于regular grids的,但__doc__中的示例本身只是结构化的,而不是常规的。

我很好奇,如果你最终切换了,你是否会发现这些方法之间有什么显着的差异。欢迎使用SciPy。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5146025

复制
相关文章

相似问题

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