NumPy插值:递减的xp

9

我想要插值一个numpy数组,而np.interp几乎完全符合我的要求:

interp(x, xp, fp, left=None, right=None)
One-dimensional linear interpolation.

除此之外:

不检查 x 坐标序列 xp 是否递增。如果 xp 不是递增的,则结果毫无意义。

我的 xp 是递减的,那么哪个更好: 反转 xpfp 的方向:

np.interp(x, xp[::-1], fp[::-1])

或将x和xp反转:

np.interp(-x, -xp, fp)

还有更好的方法吗?

结果有什么不同吗? - hpaulj
@hpaulj 我没有看到。 - chw21
我认为第一个可能更好,因为在过程中不会生成临时数组。 - Kattern
1
不幸的是,interp需要一个连续的数组才能工作(请参见此处的源代码[https://github.com/numpy/numpy/blob/master/numpy/core/src/multiarray/compiled_base.c#L533]),而反向视图则不是连续的。因此,即使@kattern的建议似乎是一个好主意,它仍然会生成临时数组。只有两个而不是三个,所以这可能仍然是更好的选择。 - Jaime
@Jaime 很有趣,从未深入研究过numpy代码的实现细节。 - Kattern
2个回答

5
感谢所有提供意见的人,特别是@Jaime。
我做了一些实验,得出以下结论:
1)除了舍入误差外,我提到的两种方法都有相同的结果。
2)它们所需的时间基本相同。
3)我尝试了scipy版本,但它会拒绝assume_sorted标志。也许我的scipy版本过时了。我怀疑如果引发该标志,scipy在内部对数组进行排序。但是数值已经按相反方向排序,因此不需要这样做。
无论如何,我将使用反向方法:
np.interp(x, xp[::-1], fp[::-1])

请记住,在这种情况下,如果你需要它们,你还必须颠倒leftright


这个解决方案没有考虑到有序和无序x值的两种情况。在interpolate.interp1d函数中使用assume_sorted选项应该可以解决问题。 - crlb
根据问题,在我的情况下,x值是有序的,只是按降序排列。不,assume_sorted=False选项对我没有起作用,因为我的scipy版本太旧了。 - chw21

4
如果您可以访问Scipy,您可以使用函数interp1d,该函数具有关键字assume_sorted=False来处理递减数组。
编辑:此解决方案处理有序和无序x值的两种情况。
import numpy as np
from scipy import interpolate
import matplotlib.pyplot as plt

# Decreasing array
x = np.arange(0, 10)[::-1]
y = np.exp(-x/3.0)

# Interpolation object
f = interpolate.interp1d(x, y, assume_sorted = False)

xnew = np.arange(3,5)
ynew = f(xnew)   # use interpolation function returned by `interp1d`
plt.plot(x, y, 'o', xnew, ynew, '-')
plt.show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接