调用basemap的addcyclic函数触发IndexError,寻求非重装修复方案
使用Basemap的addcyclic函数时遭遇IndexError的排查与修复
错误详情
IndexError Traceback (most recent call last) ~\AppData\Local\Temp/ipykernel_11852/1134487354.py in 6 m.drawmeridians(np.arange(0.,360.,90.),linewidth=0.4,color='gray',labels=[True,True,True,True]) 7 #在Py3.7下使用basemap==1.2.0,在循环填白addcyclic时可能会报错 ----> 8 psi_p1,lon1=addcyclic(np.array(psi_p),np.array(lon)) 9 lonsn, latsn = np.meshgrid(lon1, lat) 10 x_cyc,y_cyc=m(lonsn,latsn) #建立投影坐标映射 D:\AnacondaSoftware\lib\site-packages\mpl_toolkits\basemap_init_.py in addcyclic(*arr, **kwargs) 5101 return _addcyclic_lon(arr[-1]) 5102 else: -> 5103 return list(map(_addcyclic,arr[:-1])) + [_addcyclic_lon(arr[-1])] 5104 5105 def _choosecorners(width,height,**kwargs): D:\AnacondaSoftware\lib\site-packages\mpl_toolkits\basemap_init_.py in _addcyclic(a) 5086 raise ValueError('The specified axis does not correspond to an ' 5087 'array dimension.') -> 5088 return npsel.concatenate((a,a[slicer]),axis=axis) 5089 def _addcyclic_lon(a): 5090 """addcyclic function for a single longitude array""" IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices
相关代码
psi_p1,lon1=addcyclic(np.array(psi_p),np.array(lon))
当前环境
- Python 3.8.8
- numpy 1.23.5
- basemap 1.2.2
问题分析与修复方案
1. 版本兼容性确认
该错误确实由版本不兼容导致。Basemap属于维护状态的库,numpy 1.20+对数组索引的校验规则更为严格,而Basemap 1.2.2的addcyclic函数内部切片逻辑未适配新版本numpy的索引要求,最终触发IndexError。
2. 无需重装的修复方法
方法一:手动修改Basemap源码适配
找到Basemap安装目录下的mpl_toolkits/basemap/__init__.py,定位到_addcyclic函数(约5080行附近),将生成slicer的逻辑调整为纯整数/切片类型:
# 调整slicer生成代码,确保索引为合法类型 slicer = [slice(None)] * a.ndim slicer[axis] = slice(0, 1)
修改后保存文件,重启Python环境即可生效。
方法二:自定义实现addcyclic功能
完全绕开Basemap的bug,自己编写循环补全逻辑:
def custom_addcyclic(data, lon): # 补全经度:添加360°对应列 lon_cyclic = np.concatenate([lon, [lon[0] + 360]]) # 补全数据:复制第一列作为最后一列 data_cyclic = np.concatenate([data, data[:, [0]]], axis=1) return data_cyclic, lon_cyclic # 替换原调用代码 psi_p1, lon1 = custom_addcyclic(np.array(psi_p), np.array(lon))
方法三:降级numpy到兼容版本(谨慎操作)
若环境允许,可临时降级numpy到Basemap 1.2.2适配的稳定版本:
pip install numpy==1.19.5 --force-reinstall
注意:降级前需确认其他依赖模块是否兼容numpy 1.19.x,避免引发新问题。
内容的提问来源于stack exchange,提问作者Yixin
相关产品推荐
相关产品推荐

