使用scipy interp2d函数时,我一直有无效的输入错误.事实证明问题来自bisplrep函数,如下所示:
import numpy as np
from scipy import interpolate
# Case 1
x = np.linspace(0,1)
y = np.zeros_like(x)
z = np.ones_like(x)
tck = interpolate.bisplrep(x,y,z) # or interp2d
Run Code Online (Sandbox Code Playgroud)
返回: ValueError: Invalid inputs
事实证明,我给出的测试数据interp2d仅包含第二轴的一个不同值,如上面的测试样本.该bisplrep函数内部interp2d认为它作为一个无效的输出:这可以被认为是可接受的行为:interp2d与bisplrep期待的2D网格,我只是给他们值沿着一条线.
另外,我发现错误信息还不清楚.其中一个可能包括一个测试interp2d来处理这种情况:类似的东西
if len(np.unique(x))==1 or len(np.unique(y))==1:
ValueError ("Can't build 2D splines if x or y values are all the same")
Run Code Online (Sandbox Code Playgroud)
可能足以检测到这种无效输入,并引发更明确的错误消息,甚至直接调用更合适的interp1d函数(这在这里工作得很好)
我以为我已正确理解了这个问题.但是,请考虑以下代码示例:
# Case 2
x = np.linspace(0,1)
y …Run Code Online (Sandbox Code Playgroud) 我在网格点z从 2D 函数f中采样了数据x, y,如z = f(x, y).
很容易f用scipy.interp2dvia进行插值f = interp2d(x, y, z)。
但是,评估会f(x, y)返回整个 2D 网格,就好像我已经完成了一样
xx, yy = np.meshgrid(x, y)
f(xx, yy)
Run Code Online (Sandbox Code Playgroud)
我想要的行为是简单地返回 values [f(x[i], y[i]) for i in range(len(x))],我相信这是 numpy 中几乎任何其他方法的行为。
我想要这种行为的原因是我正在寻找f由对沿着“时间”表面描绘的路径(t, u(t))。
np.diag(f(t, u(t)))与 不同也令人惊讶np.array([f(ti, u(ti)) for ti in t]),所以我不清楚如何f(t, u(t))从通过interp2d.
编辑:关于diag,我只是认为我们应该有np.diag(f(t, u(t))) == np.array([f(ti, u(ti)) …