使用scipy.interpolate.interp1d计算x值,其中y = 0.95

时间:2017-05-04 09:18:05

标签: arrays python-2.7 numpy scipy interpolation

我有两个x和y数组。我没有两个数组之间的关系,但我希望能够在点之间线性插值到y = f(x),这样我就可以计算x值,其中y = 0.95。我到目前为止使用的方法如下:

import numpy as np
from scipy.interpolate import interp1d    

def NearestValue(array,value):
#returns the index of the element of the array which is closest to value

idx = (np.abs(array-value)).argmin()
return idx

x =[[   0. ],[   9.9],[  19.8],[  31.5],[  41.9],[  49.1],[  59. ],[  70. ],[  80.4],[ 100. ]]

y= [ 0.011905, 0.140795, 0.600562, 0.757247, 0.874564, 0.934559, 0.961719, 0.986099,  0.990284, 0.998254]

f = interp1d(x,y)

x_new  = np.linspacex(x[0],x[9],1000)
y_new = f(x_new)

NearestIndex = NearestValue(y_new,0.95)

x_nearest = x_new[NearestIndex]

此方法返回x_new中的值,该值具有最接近0.95的最接近的对应y_new值。有没有办法可以计算出y值正好为0.95的x值?

1 个答案:

答案 0 :(得分:1)

我认为这就像插入x作为y的函数一样简单(我还需要展平x以避免错误):

import numpy as np
from scipy.interpolate import interp1d    

def NearestValue(array,value):
    #returns the index of the element of the array which is closest to value

    idx = (np.abs(array-value)).argmin()
    return idx

x =[[   0. ],[   9.9],[  19.8],[  31.5],[  41.9],[  49.1],[  59. ],[  70. ],[  80.4],[ 100. ]]

y= [ 0.011905, 0.140795, 0.600562, 0.757247, 0.874564, 0.934559, 0.961719, 0.986099,  0.990284, 0.998254]

f = interp1d(y, np.array(x).flatten())

print (f(0.95))
for i,_ in enumerate(y):
    print (_,  x[i][0], f(_))

编辑:我冒昧地用三行代替回答者提供的最后一行代码,这些代码表明这个解决方案有多好用。它们产生以下输出。

54.728346833578776
0.011905 0.0 0.0
0.140795 9.9 9.9
0.600562 19.8 19.8
0.757247 31.5 31.5
0.874564 41.9 41.9
0.934559 49.1 49.1
0.961719 59.0 59.0
0.986099 70.0 70.0
0.990284 80.4 80.4
0.998254 100.0 100.0