我想插入一个numpy数组,而np.interp几乎完全符合我的要求:
interp(x, xp, fp, left=None, right=None)
One-dimensional linear interpolation.
除了这一点:
不检查x坐标序列
xp
是否正在增加。 如果xp
没有增加,则结果是无意义的。
我的xp正在下降,所以哪个更好: 颠倒xp和fp的方向:
np.interp(x, xp[::-1], fp[::-1])
或反转x和xp:
np.interp(-x, -xp, fp)
还是有更好的方法吗?
答案 0 :(得分:4)
感谢所有提供意见的人,特别是@Jaime。
我做了一些实验,得出了这个结论:
1)除了舍入误差外,我提到的两种方法都有相同的结果。
2)他们都花了相同的时间
3)我尝试了scipy版本,但它会拒绝assume_sorted标志。也许我的scipy版本已经过时了。我怀疑如果该标志被引发,scipy会在内部对数组进行排序。但是这些值是按相反的方向排序的,所以它不需要这样做。
无论如何,我会使用反向方法:
np.interp(x, xp[::-1], fp[::-1])
请记住,在这种情况下,如果您需要,还必须撤销left
和right
。
答案 1 :(得分:3)
如果您有权访问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()