Cartopy基础示例运行失败,报ValueError错误求助
问题描述
已通过conda和pip3安装Cartopy及其依赖库,运行官网基础示例代码:
ax = plt.axes(projection=ccrs.PlateCarree()) ax.coastlines() plt.savefig('coastlines.pdf') plt.savefig('coastlines.png') plt.show()
触发ValueError: zero-size array to reduction operation minimum which has no identity,错误栈如下:
Traceback (most recent call last): File "/Users/mattbright/Desktop/SCripts/lattice_geo.py", line 6, in <module> ax = plt.axes(projection=ccrs.Mollweide()) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/matplotlib/pyplot.py", line 947, in axes return subplot(111, **kwargs) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/matplotlib/pyplot.py", line 1125, in subplot ax = fig.add_subplot(*args, **kwargs) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/matplotlib/figure.py", line 1402, in add_subplot ax = subplot_class_factory(projection_class)(self, *args, **kwargs) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/matplotlib/axes/_subplots.py", line 42, in __init__ self._axes_class.__init__(self, fig, self.figbox, **kwargs) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/cartopy/mpl/geoaxes.py", line 355, in __init__ super(GeoAxes, self).__init__(*args, **kwargs) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 511, in __init__ self.cla() File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/cartopy/mpl/geoaxes.py", line 528, in cla self._boundary() File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/cartopy/mpl/geoaxes.py", line 1425, in _boundary trans_path = proj_to_data.transform_path(path) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/matplotlib/transforms.py", line 1527, in transform_path return self.transform_path_affine(self.transform_path_non_affine(path)) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/cartopy/mpl/geoaxes.py", line 181, in transform_path_non_affine src_path.vertices, self.source_projection) File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/cartopy/crs.py", line 649, in quick_vertices_transform if (x.min() >= x_limits[0] and x.max() <= x_limits[1] and File "/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/numpy/core/_methods.py", line 43, in _amin return umr_minimum(a, axis, None, out, keepdims, initial, where) ValueError: zero-size array to reduction operation minimum which has no identity
已尝试重装Anaconda、回退Matplotlib至3.3.0,均无效,求其他解决方法。
解决方案
1. 修复Cartopy自然特征数据缺失/损坏问题
该错误大概率是Cartopy依赖的自然地球数据(如海岸线)未正确下载或文件损坏导致的:
- 手动下载基础数据集:获取官方提供的
ne_10m_coastline等基础数据,解压到Cartopy的数据目录,默认路径为:/Users/mattbright/opt/miniconda3/lib/python3.7/site-packages/cartopy/data/raster/natural_earth - 自定义数据路径:若不想修改默认目录,可设置环境变量
CARTOPY_DATA_DIR指向你的数据存储文件夹。 - 清理旧数据:删除原有损坏的数据文件后重新下载,确保文件完整性。
2. 统一依赖安装方式并指定兼容版本
混合使用conda和pip安装易引发依赖冲突,且版本不匹配也会导致此类错误:
- 完全用conda安装兼容版本组合:
(0.18版本的Cartopy对Python3.7、Matplotlib3.3和NumPy1.19的兼容性经过验证)# 先卸载pip安装的Cartopy pip uninstall -y cartopy # 安装兼容版本的Cartopy、Matplotlib和NumPy conda install cartopy=0.18 matplotlib=3.3 numpy=1.19 --force-reinstall
3. 显式设置坐标轴范围
自动范围计算可能出现空数组问题,手动设置范围可规避:
修改示例代码,添加坐标轴范围设置:
import matplotlib.pyplot as plt import cartopy.crs as ccrs # PlateCarree投影示例 ax = plt.axes(projection=ccrs.PlateCarree()) # 显式设置经纬度范围 ax.set_extent([-180, 180, -90, 90], crs=ccrs.PlateCarree()) ax.coastlines() plt.savefig('coastlines.pdf') plt.savefig('coastlines.png') plt.show()
若使用Mollweide投影,同样添加上述set_extent语句即可。
4. 调试并修复NumPy数组异常
错误栈指向NumPy的最小值计算,可添加调试代码确认数组状态:
在代码中插入调试语句,检查投影转换时的顶点数组:
import numpy as np # 在创建坐标轴后添加 print("Axes boundary vertices:", ax.get_extent()) # 或者查看Cartopy内部的路径顶点 path = ax._get_boundary_path() print("Path vertices shape:", path.vertices.shape)
若输出显示顶点数组为空,可尝试降级NumPy到1.19.x版本,避免新版本的计算逻辑冲突。
内容的提问来源于stack exchange,提问作者Matt Bright
相关产品推荐
相关产品推荐

