运行Cartopy示例触发ValueError零尺寸数组报错问题排查问询
问题根因
该报错是Cartopy 0.20.2与Numpy ≥1.22的已知版本兼容问题,无需提交新Issue,官方已在后续版本中修复,可直接通过本地调整解决。
触发逻辑:Cartopy在处理投影边界路径转换时,部分裁剪步骤会返回空顶点数组,旧版代码未做空数组校验,直接调用Numpy的min()/max()规约方法;Numpy从1.22版本开始,空数组上的规约操作不再返回隐式默认值,直接抛出你看到的ValueError: zero-size array to reduction operation minimum which has no identity错误。
本地修复方案
按优先级从高到低可选以下方案:
- 方案1:升级Cartopy到0.21.0及以上版本
0.20.2之后的正式版已经合入了该空数组校验的修复代码,直接执行升级即可:
如果是conda环境优先用conda源安装,可避免GEOS、PROJ等底层地理依赖的编译问题。pip install "cartopy>=0.21.0" -U - 方案2:降级Numpy到1.21.x兼容版本
如果暂时不能升级Cartopy,可将Numpy降级到不存在该兼容问题的最后一个稳定版本:
降级后无需修改其他依赖,重新运行测试代码即可正常加载海岸线图层出图。pip install numpy==1.21.6 -U - 方案3:临时热修复(不想变更现有依赖版本)
打开报错日志中提到的Cartopy安装路径下的crs.py文件,你的环境对应路径为/home/ulrich/miniconda3/lib/python3.8/site-packages/cartopy/crs.py,定位到1247行附近的边界判断逻辑,原代码为:
在判断条件最前端加空数组长度校验,修改为:if (x.min() >= x_limits[0] and x.max() <= x_limits[1] and y.min() >= y_limits[0] and y.max() <= y_limits[1]): return vertices
保存文件后重新运行脚本即可绕过该报错。if len(x) > 0 and len(y) > 0 and (x.min() >= x_limits[0] and x.max() <= x_limits[1] and y.min() >= y_limits[0] and y.max() <= y_limits[1]): return vertices
内容的提问来源于stack exchange,提问作者Thomasi Muc
相关产品推荐
相关产品推荐

