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

Basemap绘制插值网格报IndexError:1维数组被2维索引

问题背景

工作目标为对不同测站观测数据做空间插值,计算各年份插值网格的数值均值后完成可视化。
前期已完成操作:

  • 编写generate_grid函数生成经纬度网格,经Basemap投影转换后,通过inter_todf函数将插值结果展平为DataFrame并导出为CSV文件
  • 完成多年网格数据均值计算,最终得到包含序号、纬度、经度、数值4个字段、共64800行的平均数据集
    后续绘图阶段触发固定报错:
  1. 已完成numpy/pandas/matplotlib/pykrige/Basemap等依赖导入
  2. 代码执行逻辑为:通过load_data读取CSV数据,get_data提取经纬度与数值数组,prepare_map_plot初始化罗宾逊投影的Basemap画布,generate_grid完成坐标投影转换
  3. 在plot_mesh_data中调用contourf绘制填色图时,持续触发报错:
IndexError: too many indices for array: array is 1-dimensional, but 2 were indexed

报错栈指向Basemap库contourf方法内部的xx = x[x.shape[0]//2,:]语句,需排查问题完成网格数据正确绘制,输出标准全球插值填色图。

报错根因

Basemap的contourf方法要求传入的x、y坐标必须是与z值维度匹配的二维网格数组。
前期导出CSV时通过inter_todf将二维插值网格展平为一维表格,读取后提取的经纬度、数值数组均为一维结构,直接传入contourf时,方法内部尝试按二维数组规则对x做行切片(即报错栈中的xx = x[x.shape[0]//2,:]操作),就会触发维度不匹配的索引错误。
注:64800行的数据集刚好对应1°分辨率的全球等经纬度网格:纬度方向180个格点(覆盖-90°90°)、经度方向360个格点(覆盖-180°180°),总网格数180*360=64800,可直接按该维度做数组重构。

修复方案
  1. 读取CSV后先对数据按纬度、经度排序,再将一维数组重构为二维网格结构,参考代码:
import pandas as pd
import numpy as np
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

# 读取均值数据
df = pd.read_csv("your_average_grid_data.csv")
# 按纬度、经度升序排序,保证格点顺序匹配网格结构,避免绘图错位
df = df.sort_values(by=["纬度", "经度"]).reset_index(drop=True)

# 按1°全球网格维度重构数组
n_lat = 180
n_lon = 360
lon_2d = df["经度"].values.reshape(n_lat, n_lon)
lat_2d = df["纬度"].values.reshape(n_lat, n_lon)
z_2d = df["数值"].values.reshape(n_lat, n_lon)
  1. 完成投影转换后调用contourf绘图,参考代码:
# 初始化罗宾逊投影画布
plt.figure(figsize=(12, 6), dpi=100)
m = Basemap(projection="robin", lon_0=0, resolution="c")

# 二维网格坐标投影转换
x, y = m(lon_2d, lat_2d)

# 绘制填色等值图
contour_plot = m.contourf(x, y, z_2d, cmap="RdBu_r", levels=20)
# 叠加基础地理要素
m.drawcoastlines(linewidth=0.5)
m.drawcountries(linewidth=0.3)
m.drawparallels(np.arange(-90, 91, 30), labels=[1,0,0,0], fontsize=8)
m.drawmeridians(np.arange(-180, 181, 60), labels=[0,0,0,1], fontsize=8)

# 添加色标与标题
cbar = m.colorbar(contour_plot, location="bottom", pad="8%")
cbar.set_label("多年平均观测值", fontsize=10)
plt.title("全球观测值多年平均空间分布", fontsize=12)
plt.show()
  1. 若重构后绘图出现格点错位,可打印lon_2d[0,:]、lat_2d[:,0]校验经纬度的升降序,调整排序规则即可。

内容的提问来源于stack exchange,提问作者Weiss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 22:18:03