我有一组压力(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。
这是我的压力网格
https://1drv.ms/t/s!AmPNuP3pNnN8g35NPwIfzSl-VBeO https://1drv.ms/f/s!AmPNuP3pNnN8hAx3opovgipabSjJ
答案 0 :(得分:1)
您的代码存在两个问题。 x
循环的每次迭代都会覆盖第一个y
和for
,这意味着x
和y
只包含一个插值元素。要解决此问题,您可以在循环外定义x
和y
列表并附加到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输入数据也不会严格增加,您必须进行排序。