在python中的网格内插值

时间:2019-01-03 12:26:29

标签: python interpolation

我在网格上有许多高度值,由一系列列表指定:

[3, 1, -2, -3, -3] # x = 0m 
[2, -7, -14, -30, -39] # x = 10m
[46, 22, 5, -2, -8] # x = 20m

上面的示例显示了

格式的40m x 20m网格
[x=0y=0, x=0y=10...][x=10y=0, x=10y=10...] etc.

我需要计算特定x,y坐标处的高度。我看过各种插值函数和示例,但对它们没有任何意义-请帮忙!

一个例子是上面网格中x = 5m,y = 5m处的高度,该高度位于值3、1 2和-7(-1ish?)的中间

谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用scipy.interpolate.interp2d。下面的代码可以完成这项工作:

import numpy as np
from scipy.interpolate import interp2d

# Original data (e.g. measurements)
a = [3, 1, -2, -3, -3]
b = [2, -7, -14, -30, -39]
c = [46, 22, 5, -2, -8]

x = [0, 10, 20]             # x-coordinates
y = [0, 10, 20, 30, 40]     # y-coordinates

# Organise data in matrix
z = np.vstack([a, b, c]).T

# Create interpolation function
f_z = interp2d(x, y, z)

# Desired x/y values
x_interp = 5
y_interp = 5

# Collect interpolated z-value
z_interp = f_z(x_interp, y_interp)
print(z_interp)  # (result: [-0.25])

答案 1 :(得分:0)

解决方案:转换为2D阵列

import numpy as np

a = [3, 1, -2, -3, -3] # x = 0m 
b = [2, -7, -14, -30, -39] # x = 10m
c = [46, 22, 5, -2, -8] # x = 20m

all_lists = [a,b,c]


grid = np.vstack(all_lists) # Edit: thanks @jochen for better code

>>print(grid.shape)
(3, 5)

现在您可以通过x,y坐标访问网格

grid[1,1]

基于此,您可以创建逻辑。

如果x = 5,y = 5,则可以通过以下方法创建角索引:

索引:x / 5 + 0,x / 5 + 1,y / 5,y / 5 + 1 --->通过将它们结合起来,您会得到[0,0],[0,1],[1, 0],[1,1]

最后,您只需使用这些索引填充网格

SUM = grid[0,0] + grid[0,1] + grid[1,0] + grid[1,1]

答案 2 :(得分:0)

您可以使用interpolate.gridddata中的scipy函数来实现此目的。

使用以下代码,您可以从网格中获取所需的任何插值。

import itertools
import numpy as np
from scipy.interpolate import griddata

dataX0 = [3, 1, -2, -3, -3] # x = 0m
dataX10 = [2, -7, -14, -30, -39] # x = 10m
dataX20 = [46, 22, 5, -2, -8] # x = 20m
data = dataX0 + dataX10 + dataX20
points = list(itertools.product(range(0,30,10),range(0,50,10)))

outputPoint = (5,5)
outputValue = griddata(points=points,values=data, xi=outputPoint, method="cubic")
print outputValue

上面的示例为您提供ouputPoint (5,5)处的插值。输出将给出:

>>> 
-2.78976054957