1

我在 Ubuntu 16.4 上使用 Python 3.6.1 64 位、Qt 5.6.2、PyQt5 5.6,Basemap 版本为 1.0.7,matplotlib 2.0.2。当我尝试使用带有basemap的轮廓时,使用投影“cyl”,例如:

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

map = Basemap(projection='cyl',lat_0=45,lon_0=-100,resolution='c')

nlats = 73; nlons = 145; delta = 2.*np.pi/(nlons-1)
lats = (0.5*np.pi-delta*np.indices((nlats,nlons))[0,:,:])
lons = (delta*np.indices((nlats,nlons))[1,:,:])
wave = 0.75*(np.sin(2.*lats)**8*np.cos(4.*lons))
mean = 0.5*np.cos(2.*lats)*((np.sin(2.*lats))**2 + 2.)

x, y = map(lons*180./np.pi, lats*180./np.pi)

cs = map.contour(x,y,wave+mean,15,linewidths=1.5)
plt.show()

我收到以下错误:

回溯(最近一次通话最后):

文件“”,第 15 行,在 cs = map.contour(x,y,wave+mean,15,linewidths=1.5)

文件“/home/gab/anaconda3/lib/python3.6/site-packages/mpl_toolkits/basemap/init .py ”,第 521 行,在 with_transform return plotfunc(self,x,y,data,*args,**kwargs )

文件“/home/gab/anaconda3/lib/python3.6/site-packages/mpl_toolkits/basemap/init .py ”,第 3542 行,轮廓 xx = x[x.shape[0]/2,:]

IndexError:只有整数、切片 ( :)、省略号 ( ...)、numpy.newaxis ( None) 和整数或布尔数组是有效的索引

如果我使用例如投影“正交”,则不会发生此错误。我在 Python 2.6 上运行这段代码没有问题。这个问题似乎和这个问题一样没有回答。

有任何想法吗?

4

2 回答 2

1

此行为是 python3 整数除法的后续行为。寻找例子:

1)python3:

n=100
print (n/2, (n+1)/2)

输出:50.0 50.5

2) 对于 python 2.7,此代码返回50 50

解决方案:

1) 使用 python3 的除法手动更新底图行。

你必须为整数 n 写:n//2这是从 python2 应用除法。

2) 或者用 python2 运行你的程序。

于 2017-06-30T22:41:13.813 回答
1

回应 lanadaquenada (我似乎无法评论)

根据 Serenity 的帖子,您实际上需要修改底图代码,而不是您的代码。底图很旧,不再真正受支持。它是在 python 2.x 发布时创建的,它似乎使用了 python 2 整数除法。Python 3 现在“正确”地进行除法,但是创建了一些旧代码以利用 Python 2 的除法。

在使用 python3 和 matplotlib 1.5.3 时,我会收到有关此问题的警告,但这不是致命的。升级到 matplotlib 2.0.2 后,这个错误变得致命,我的谷歌搜索导致了你的帖子。

因此,按照 Serenity 的建议,您需要手动更改线路

xx[x.shape[0]/2, :]

xx[x.shape[0]//2, :] 

对我来说,这是 3452 和 3644path_where_your_python_libraries_are_installed/site-packages/mpl_toolkits/basemap/__init__.py

我正在使用底图版本 1.0.7。

从 matplotlib 1.5.3 过渡到 2.0.2 版时,我需要进行此更改

这阻止了我的代码崩溃,并且我对旧 matplotlib 版本的基本测试似乎产生了正确的结果。

我希望这不会在其他地方产生意想不到的后果,尽管底图是用旧的整数除法设计的,所以我认为它没问题

于 2017-07-12T06:33:51.230 回答