我在网格上有许多高度值,由一系列列表指定:
[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?)的中间
谢谢
答案 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