gpt4 book ai didi

Python/Scipy 二维插值(非均匀数据)

转载 作者:太空狗 更新时间:2023-10-29 16:56:28 29 4
gpt4 key购买 nike

这是我之前帖子的后续问题: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”。 griddata 似乎产生了我期望的结果,但“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()

最佳答案

看来你明白了。

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

现在,您当前的问题是如果不是所有的点都知道该怎么办。这称为非结构化 数据。您所拥有的只是字段中的一些点。您不一定要构造所有顶点都具有已知值的矩形。对于这种类型的数据,您可以使用(如您所用)griddata,或 BivariateSpline 的风格。

现在选择哪个?

与结构化RectBivariateSpline 最接近的类比是非结构化 BivariateSpline classes : SmoothBivariateSplineLSQBivariateSpline。如果您想使用样条插值数据,请使用这些。这使您的函数平滑且可微分,但您可以获得在 Z.max() 或 Z.min() 之外摆动的表面。

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

我很好奇,如果您最终转换了方法,是否发现这些方法之间存在任何显着差异。欢迎来到 SciPy。

关于Python/Scipy 二维插值(非均匀数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146025/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com