python计算反距离权重插值

本文主要介绍的是反距离权重插值的方法,由于本人也是刚开始学习python,所以代码部分有许多需要改进的地方,我自己写的代码存在一定的缺陷,有看不懂的地方可以去看一下其它作者的公式(第一次写博客,不太会用,所以一切从简)请大家见谅。
1、先简单介绍一下反距离权重插值:就是需要计算插值的点本身根据自身到其它已知点的距离(自己选择点,我的代码部分选取的是距离插值点最近的3个点),分别算出到各点的权重(可以自己选择,本文选择的是距离倒数的四次方),再分别拿各个权重乘以各个已知点的数值,最后求和得到所需插值点的数值。
2.代码展示

import pandas as pd
import numpy as np
from scipy.spatial import KDTree #KD树有助于寻找距离最近的点与计算距离
"""
3个点的反距离权重插值
"""
x = np.linspace(20,21,25)  #已知点横坐标,纬度
y = np.linspace(100,102,50)  #已知点纵坐标,经度
z1 = np.random.randn(25,50) #生成25x50的矩阵
z = np.array(z1).reshape(-1,1)  #已知点数值
xi = np.linspace(20,21,50)  #未知点横坐标,纬度
yi = np.linspace(100,102,100)  #未知点纵坐标,经度
d = []  #已知点的坐标
for i in x:
    for j in y:
        a = [i,j]
        d.append(a)

d1 = np.array(d)

p = []  #未知点的坐标
for i in xi:
    for j in yi:
        a = [i,j]
        p.append(a)

p1 = np.array(p)

tree = KDTree(d1)   #生成KD树
dist,ind = tree.query(p1,k = 3)   #寻找最近的3个点,计算距离(默认欧式距离)

dist1 = pd.DataFrame(dist).replace(0,0.000001)  #未知点到已知3个点最近距离矩阵(其中距离为0的值用0.000001代替,防止下面计算倒数出现分母为0的结果)
m = 1/(np.square(dist1)*np.square(dist1))  #距离四次方的倒数

m1 = m.sum(axis = 1)
m11 = np.array(m1).reshape(len(xi)*len(yi),1)
m2 = np.divide(m,m11)      #得到权重

ind1 = ind.flatten()
newz=z[ind1].reshape(ind.shape)   #得到插值点身边最近3个已知点的数值,方便下面计算

z_2 = newz*m2    
z_3 = z_2.sum(axis = 1)   #得到插值
z_4 = np.array(z_3).reshape(50,100)
``


猜你喜欢

转载自blog.csdn.net/m0_48432748/article/details/107291110
今日推荐