我有一个如下所示的数据文件:
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个这样的行。对于这些x和y中的每一个,我有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插值的最佳方法是什么?
答案 0 :(得分:1)
RectBivariateSpline
is for uniform grids only,所以你不能使用它。
否则,听起来你可能只是错误地输入数据 - 但我们无法分辨,因为你没有向我们展示代码的关键部分。对于不规则网格,x, y, z
的{{1}}输入应具有相同的点数。你的投入是否真的如此? (在您致电interp2d
之前,请打印interp2d
等)如果这没有向您显示您做错了什么,请修改您的问题以显示minimal, complete, and verifiable example。
答案 1 :(得分:1)
您对griddata
的来电不正确。语法为griddata(points, values, xi, ...)
,其中:
<强>
points
强>: ndarray of floats,shape(n,D)数据点坐标。能够 要么是形状(n,D)的数组,要么是ndim数组的元组。<强>
values
强>: 浮点或复数的ndarray,shape(n,)数据值。<强>
xi
强>: 浮动的ndarray,形状(M,D)插值的点 数据
如果我正确理解您的描述,您尝试插入的功能的格式为alpha = f(R, z)
,R
和z
指定alpha
的坐标对数值进行了抽样R
,z
和alpha
都应该是相同长度的一维向量。如果这种解释是正确的,那么
values
参数应为alpha
points
应该是(n, 2)
数组,其中包含连接在一起的R
和z
个向量。
您还需要指定xi
,它对应于评估插值的点(即您的&#34; xnew,ynew&#34;值)。这 与alpha
完全相同!
正如@Mike所提到的,RectBivariateSpline
仅用于常规网格(就像interp2d
一样),你当然不能通过用NaN填充缺失值来解决这个约束。