我有一个数据文件,看起来像这样:
1.0 2.1 2.4 3.0 3.1 3.2 3.7 3.9 4.2
1.3 1.6 1.8 1.9 2.8 2.9 3.7 3.9 4.0 4.4 4.7 4.9
1.4 0.4 0.5 1.5 1.8 2.2 2.5 2.8 2.9 3.6
1.8 1.1 1.3 1.9 2.1 2.8 3.7 3.9 4.0 4.2 4.7 4.9 5.2 5.8
2.1 0.2 0.3 1.1 1.4 1.6 1.9
这里的第一列对应于 x 值(不均匀间隔),对于每个 x 值,该行中的其余数据是 y 值。我知道每行中 y 值的数量。原始数据文件有 200 个这样的行。对于这些 xs 和 ys 中的每一个,我都有 z(x,y)。现在我想对新网格进行 2D 插值,如下所示:
1.1 1.0 2.2 2.4
1.3 1.1 1.3 2.0 2.2
1.7 1.2 1.5 2.0 2.4
1.9 1.4 1.5 1.8 2.0 2.2 2.4
(40 such rows)
等等。这里和以前一样,第一列是 x(xnew) 值,行中的所有剩余元素都是 y(ynew) 值,没有一个是均匀间隔的。我必须找到znew(xnew,ynew)。
我已经尝试了以下事情,分别R
z
和alpha
x
y
和z
:
将
z
设置为 2D 数组,并将所有缺失值设置为nan
。使用interpolate.interp2d
.它说,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=1,1 nx,ny=128,129 m=16000 fp=nan s=0.000000 and znew has only 0 or nan as values.
f1=interpolate.griddata(R,z,alpha,method='linear')
QH6154 qhull precision error: initial facet 1 is coplanar with the interior point ERRONEOUS FACET:
f1=interpolate.RectBivariateSpline(R,z,alpha)
它给出了一个错误。
对此数据执行 2D 插值的最佳方法是什么?
RectBivariateSpline
仅适用于统一网格,因此您不能使用它。
否则,听起来您可能只是错误地输入了数据 - 但我们无法判断,因为您没有向我们展示代码的关键部分。 对于不规则网格,interp2d
的x, y, z
输入应具有相同的点数。 您的输入是这样吗? (就在你打电话interp2d
之前,打印x.size
等) 如果这没有显示您做错了什么,请编辑您的问题以显示最小、完整且可验证的示例。
您对griddata
的调用不正确。语法是 griddata(points, values, xi, ...)
,其中:
points
: 浮点数的数组,形状(n,D)数据点坐标。能 可以是形状数组 (n, D),也可以是 ndim 数组的元组。
values
: 浮点数或复数形状 (n,) 数据值的数组。
xi
: 浮点数、形状 (M, D) 的数组,用于插值的点 数据。
如果我正确理解您的描述,您尝试插值的函数具有 alpha = f(R, z)
形式,以便R
和z
指定对alpha
值进行采样的坐标。 R
、z
和alpha
都应该是相同长度的一维向量。如果这种解释是正确的,那么
-
values
参数应alpha
-
points
应该是一个(n, 2)
数组,由R
和连接在一起的z
向量组成。 -
您还需要指定
xi
,它对应于要计算插值的点(即您的"xnew,ynew"值)。这和alpha
不是一回事!
正如@Mike提到的,RectBivariateSpline
仅适用于常规网格(如interp2d
),您当然无法通过仅用 NaN 填充缺失值来绕过此约束。