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

numpy.interpd -returning only the last value after 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 ,一切似乎都很好,直到 there.I 无法理解为什么会这样...... 我是新手.........请帮助

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

这是我的压力网格

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

您的代码有两个问题。首先 xy 会在 for 循环的每次迭代中被覆盖,这意味着 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 输入数据也不会严格递增,您将不得不排序。