You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为等高图处理维度匹配的一维x、y、z数组(含inf值)?

解决一维x/y/z生成等高图的问题

核心问题分析

你之前用np.meshgrid(z,z)完全搞错了逻辑——meshgrid是用来把一维的x、y坐标转换成二维网格,而非用z生成网格。另外10201刚好是101×101,说明你的数据是按101×101的规则网格采样得到的一维数组,所以第一步要把x、y还原成对应网格,再将z重塑为匹配的二维形状。

正确处理步骤

  1. 还原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)
    
  2. 将一维z重塑为二维数组
    把长度10201的z转换成(101,101)的二维数组,注意维度顺序要和meshgrid对应:

    Z = z.reshape(len(y_unique), len(x_unique))
    # 若图形方向不对,可尝试转置:Z = z.reshape(...).T
    
  3. 处理inf值
    把inf替换为NaN(matplotlib的contour会自动忽略NaN,不影响正常区域绘制):

    Z[np.isinf(Z)] = np.nan
    
  4. 绘制等高图
    用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ệ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:05:38