numpy.interpd - 仅返回插值后的最后一个值

时间:2017-03-08 05:07:16

标签: python-2.7 numpy linear-interpolation

我有一组压力(p)和vmr的数据点。 我想找到另一个压力网格(pressure_grid)的vmr值。我使用了np.interp,

for lines in itertools.islice(input_file, i, l):
   lines=lines.split()
   p.append(float(lines[0]))
   vmr.append(float(lines[3]))
   x = np.array(p)
   y = np.array(vmr) 

yi=np.interp(pressure_grid,x,y)

但是当我试图打印" yi"它只打印对应于" pressure_grid"的最后一个值的值(即vmr值)。对于所有迭代,它打印相同的值 我试图打印p和vmr,一切似乎都很好,直到那里。我无法理解为什么会发生这种情况...... 我是新来的........请帮忙

这是我的文件的样子,第一列-p和第二列-vmr。

enter image description here

这是我的压力网格

enter image description here

https://1drv.ms/t/s!AmPNuP3pNnN8g35NPwIfzSl-VBeO https://1drv.ms/f/s!AmPNuP3pNnN8hAx3opovgipabSjJ

1 个答案:

答案 0 :(得分:1)

您的代码存在两个问题。 x循环的每次迭代都会覆盖第一个yfor,这意味着xy只包含一个插值元素。要解决此问题,您可以在循环外定义xy列表并附加到for循环中,或者更简单地说,只需使用numpy.loadtxt()

import numpy as np
data = np.loadtxt('demo.txt',comments='<',usecols=[0,2])

在这里,我已指定跳过以小于号开头的行,因此我们只获取实际数据。

其次,要使numpy.interp实际工作,您需要x坐标为increasing sequence。 (查看备注)。对于您的数据,x是递减序列,因此您应该在加载数据后翻转数据:

x = data[::-1,0]
y = data[::-1,1]
interpolation = np.interp(grid,x,y)

或者,您可以在原始的未打开数据上使用scipy.interpolate包。这样做的另一个好处是允许您推断输入域未包含的数据:

from scipy import interpolate
interpolation = interpolate.interp1d(x,y,fill_value='extrapolate')

注意:您的输入文件似乎设置了多个<Matrix> </Matrix>。为了使所有这些工作,我修剪文件,使其只包含一个数据集。否则,即使在翻转之后,您的x输入数据也不会严格增加,您必须进行排序。

相关问题