如何为等高图处理维度匹配的一维x、y、z数组(含inf值)?
解决一维x/y/z生成等高图的问题
核心问题分析
你之前用np.meshgrid(z,z)完全搞错了逻辑——meshgrid是用来把一维的x、y坐标转换成二维网格,而非用z生成网格。另外10201刚好是101×101,说明你的数据是按101×101的规则网格采样得到的一维数组,所以第一步要把x、y还原成对应网格,再将z重塑为匹配的二维形状。
正确处理步骤
还原x/y的网格结构
先提取x和y的唯一采样值,再生成二维网格:import numpy as np # 提取x、y的唯一值(每个维度对应101个采样点) x_unique = np.unique(x) y_unique = np.unique(y) # 生成对应二维网格 X, Y = np.meshgrid(x_unique, y_unique)将一维z重塑为二维数组
把长度10201的z转换成(101,101)的二维数组,注意维度顺序要和meshgrid对应:Z = z.reshape(len(y_unique), len(x_unique)) # 若图形方向不对,可尝试转置:Z = z.reshape(...).T处理inf值
把inf替换为NaN(matplotlib的contour会自动忽略NaN,不影响正常区域绘制):Z[np.isinf(Z)] = np.nan绘制等高图
用matplotlib完成绘图:import matplotlib.pyplot as plt fig, ax = plt.subplots() contour = ax.contour(X, Y, Z) # 可选:添加等高线数值标签 ax.clabel(contour, inline=True, fontsize=10) ax.set_xlabel('x') ax.set_ylabel('y') plt.show()
特殊情况处理(非规则网格采样)
如果x/y是随机采样而非规则网格,不能直接reshape,需要用插值生成规则网格的Z值:
from scipy.interpolate import griddata # 生成规则网格的采样点 xi = np.linspace(x.min(), x.max(), 101) yi = np.linspace(y.min(), y.max(), 101) XI, YI = np.meshgrid(xi, yi) # 用三次插值填充网格 ZI = griddata((x, y), z, (XI, YI), method='cubic') # 处理inf值 ZI[np.isinf(ZI)] = np.nan # 绘图 ax.contour(XI, YI, ZI)
内容的提问来源于stack exchange,提问作者Hoàng Lệ
相关产品推荐
相关产品推荐

