【python由站点数据插值到网格数据方法对比】
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
# 创建一些站点数据
np.random.seed(1)
points = np.random.rand(10, 2) # 站点坐标
values = np.random.rand(10) * 10.0 # 站点值
# 定义网格
x = np.linspace(0, 1, 50)
y = np.linspace(0, 1, 50)
X, Y = np.meshgrid(x, y)
# 使用scipy的griddata进行插值
Z1 = griddata((points[:, 0], points[:, 1]), values, (X, Y), method='linear')
# 使用自定义的插值方法
def custom_linear_interp(points, values, xi, yi):
# 这里只是一个简单的示例,实际情况可能需要更复杂的插值方法
x_points, y_points = points
v_above = np.interp(xi, x_points[yi == 1], values[yi == 1])
v_below = np.interp(xi, x_points[yi == 0], values[yi == 0])
return np.where(yi >= 0.5, v_above, v_below)
Z2 = custom_linear_interp(points, values, X, Y)
# 可视化结果
fig, ax = plt.subplots()
cs = ax.contourf(X, Y, Z1, levels=np.arange(0, 11, 1), cmap=plt.cm.viridis)
ax.contour(X, Y, Z1, levels=np.arange(0, 11, 1), colors='k', linewidths=0.5)
ax.scatter(points[:, 0], points[:, 1], s=50, c=values, cmap=plt.cm.viridis, edgecolors='k', zorder=10)
ax.set_title('Scipy griddata result')
fig, ax = plt.subplots()
cs = ax.contourf(X, Y, Z2, levels=np.arange(0, 11, 1), cmap=plt.cm.viridis)
ax.contour(X, Y, Z2, levels=np.arange(0, 11, 1), colors='k', linewidths=0.5)
ax.scatter(points[:, 0], points[:, 1], s=50, c=values, cmap=plt.cm.viridis, edgecolors='k', zorder=10)
ax.set_title('Custom linear interpolation result')
plt.show()
这段代码首先创建了一些随机的站点数据,然后定义了一个网格。接着使用了scipy.interpolate.griddata
进行插值,并且演示了如何实现一个简单的自定义线性插值函数。最后,通过matplotlib
的contourf
和contour
方法分别绘制了两种方法的插值结果,并用散点标出了原始的站点位置。
评论已关闭