使用 Python 底图 etopo() 生成 IndexError

Using Python basemap etopo() generates IndexError

我正在尝试使底图正常工作。我已经成功安装了 matplotlib、basemap 和 Pillow,可以绘制基本图。下面的代码对我有用。

from mpl_toolkits.basemap import Basemap
from PIL import Image
import matplotlib.pyplot as plt

m = Basemap(projection = 'mill',
        llcrnrlat = -90,
        llcrnrlon = -180,
        urcrnrlat = 90,
        urcrnrlon = 180,
        resolution = 'c')

m.drawcoastlines()
#m.etopo()

plt.show()

但是,取消注释 'etopo()' 命令会产生以下错误。

Traceback (most recent call last):

  File "C:\Users\xxx\Desktop\helper.py", line 13, in <module> m.etopo()

  File "C:\Python35-32\lib\site-packages\mpl_toolkits\basemap\__init__.py",    line 4061, in etopo return self.warpimage(image='etopo',scale=scale,**kwargs)

  File "C:\Python35-32\lib\site-packages\mpl_toolkits\basemap\__init__.py", line 4167, in warpimage np.concatenate((self._bm_lons,self._bm_lons+360),1)

IndexError: axis 1 out of bounds [0, 1)

我已经尝试重新安装和更新所有相关包,但没有奏效。对于这种情况,我也找不到有关此错误的任何信息。我在 Windows 8.1 32 位 Python 3.5.1

如果您只是测试 Basemap.etopo() 功能,我更新了您的脚本:

from mpl_toolkits.basemap import Basemap
from PIL import Image
import matplotlib.pyplot as plt

# make a miller cylindrical projection with defaults
m = Basemap('mill')

m.drawcoastlines()
# now displays topo relief image
m.etopo()

plt.show()

这似乎是底图与最近的 numpy 版本之间的不兼容问题。建议的解决方案恢复为默认投影,因为第一个关键字不是投影而是 llcrnrlat。

我还没有弄清楚到底是什么导致了 IndexError,但是恢复到旧的 numpy 版本是可行的。似乎 numpy 1.9.2 是最新的工作版本。可能是连接命令更改了某些内容。

编辑: 我更改了 basemap/init.py 中的第 4167 行以获得与旧 numpy 版本必须相同的结果。它似乎可以解决问题:

Old: np.concatenate((self._bm_lons,self._bm_lons+360),1)
New: np.concatenate((self._bm_lons.T,self._bm_lons.T+360)).T

沿一维数组和非零轴连接现已弃用,这就是引发异常的原因。