【问题标题】:Interpolating within a grid in python在python中的网格内插值
【发布时间】:2019-01-03 12:26:28
【问题描述】:

我在一个网格中有多个高度值,在一系列列表中指定:

[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?)

谢谢

【问题讨论】:

标签: python interpolation


【解决方案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])

【讨论】:

    【解决方案2】:

    解决方案:转化为二维数组

    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,那么您可以通过以下方式创建方角索引:

    indexes: 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]
    

    【讨论】:

    • 您的网格的构建是不必要的复杂。可能是grid = np.vstack([a, b, c]) 您的代码实际上为 3 个网格构造和分配内存,丢弃了前两个。
    • 谢谢。我尝试了 vstack,它只是扩展了数组,但是使用您的代码,它做得更好
    【解决方案3】:

    您可以使用来自scipyinterpolate.gridddata 函数来实现此目的。

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

    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
    

    【讨论】:

    • 您可能需要检查this post
    • 您链接的帖子适用于此处给出的大多数答案。或许您可以将它作为对原始问题的评论添加,以便更容易被其他读者注意到?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2018-08-14
    相关资源
    最近更新 更多