本文主要介绍的是反距离权重插值的方法,由于本人也是刚开始学习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)
``