numpy interp 减少 xp

numpy interp decreasing xp

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

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

除了这个位:

Does not check that the x-coordinate sequence xp is increasing. If xp is not increasing, the results are nonsense.

我的 xp 正在减少,所以哪个更好: 反转 xp 和 fp 的方向:

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

或反转 x 和 xp:

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

或者有更好的方法吗?

如果您有权访问 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()

感谢所有提供意见的人,尤其是@Jaime。

我试验了一下,得出了这个结论:

1) 除了舍入误差,我提到的两种方法结果都是一样的

2) 它们花费的时间几乎相同

3) 我尝试了 scipy 版本,但它会拒绝 assume_sorted 标志。也许我的 scipy 版本已经过时了。我怀疑如果升起该标志,scipy 会在内部对数组进行排序。但是值是排序的,只是方向相反,所以不需要这样做。

反正我用反方向的方法:

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

请记住,在这种情况下,如果需要,您还必须反转 leftright