• 利用griddata进行二维插值


    有时候会碰到这种情况:

    实际问题可以抽象为 (z = f(x, y)) 的形式,而你只知道有限的点 ((x_i,y_i,z_i)),你又需要局部的全数据,这时你就需要插值,一维的插值方法网上很多,不再赘述,这里仅介绍二维的插值法

    这里主要利用 scipy.interpolate 包里 griddata 函数

    griddata(points, values, xi, method='linear', fill_value=numpy.nan, rescale=False)

    • points:二维数组,第一维是已知点的数目,第二维是每一个点的 (x,y) 坐标
    • values:一维数组,和 points 的第一维长度一样,是每个坐标的对应 (z)
    • xi:需要插值的空间,一般用 numpy.mgrid 函数生成后传入
    • method:插值方法
      • nearest
      • linear
      • cubic
    • fill_value:无数据时填充数据

    该方法返回的是和 xi 的 shape 一样的二维数组

    【example】

    import numpy as np
    import matplotlib.pyplot a plt
    from scipy.interpolate import griddata
    
    points = np.random.rand(n, 2)  # n是已知点个数
    values = np.random.rand(n)  # 对应没每个点的值
    
    # 插值的目标
    # 注意,这里和普通使用数组的维度、下标不一样,是因为如果可视化的话,imshow坐标轴和一般的不一样
    x, y = np.mgrid[
            end1:start1:step1 * 1j,
            start2:end2:step2 * 1j]
    
    # grid就是插值结果,你想要的到的区间的每个点数据都在这个grid矩阵里
    grid = griddata(points, values, (x, y), method="cubic", fill_value=0)
    
    # 这里通过imshow显示时,坐标思维要按照计算机的来,普通图片是2维数组
    # x 是最终结果的第一维,下标是从上到下由零增加
    # y 是最终结果的第二维,下标是从左到右由零增加
    plt.subplot(1, 1, 1)
    plt.title("0°")
    plt.imshow(grid, cmap='jet')  # contourf jet gray
    plt.colorbar()
    plt.show()
    

    np.mgrid 函数每一个维度最后一个参数:

    • 可以是实数中的整数,表示步长,此时不包括末尾数据(左闭右开)
    • 可以是实部为零,虚部为整数的复数,这个数字表示该区间想要插值多少个点的数据(闭区间)
  • 相关阅读:
    BZOJ3832: [Poi2014]Rally(拓扑排序 堆)
    UVAlive6807 Túnel de Rata (最小生成树)
    UVAlive6800The Mountain of Gold?(负环)
    cf623A. Graph and String(二分图 构造)
    BZOJ4144: [AMPPZ2014]Petrol(最短路 最小生成树)
    cf605D. Board Game(BFS 树状数组 set)
    为什么要去创业?
    后缀数组练习题若干
    Android开发 之 我的jar包引用方法
    IBM-ETP 实训项目前一天
  • 原文地址:https://www.cnblogs.com/ice-coder/p/12652572.html
Copyright © 2020-2023  润新知