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
您的代码有两个问题。首先 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 输入数据也不会严格递增,您将不得不排序。
我有一组压力 (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
您的代码有两个问题。首先 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 输入数据也不会严格递增,您将不得不排序。