1

Basemapバージョン1.0.7、matplotlib 2.0.2を搭載したUbuntu 16.4でPython 3.6.1 64ビット、Qt 5.6.2、PyQt5 5.6を使用しています。次のように、投影「cyl」を使用して basemap でcontourfを使用しようとすると、次のようなります。

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

lanadaquenada への対応 (コメントできないようです)

Serenity の投稿に基づいて、実際にはコードではなくベースマップ コードを変更する必要があります。ベースマップは古く、実際にはサポートされていません。これは、python 2.x がリリースされたときに作成されたもので、python 2 の整数除算を利用しているようです。Python 3 は除算を「正しく」実行するようになりましたが、Python 2 の除算を利用するためにいくつかの古いコードが作成されました。

python3 と matplotlib 1.5.3 を使用しているときに、この問題に関する警告が表示されましたが、致命的ではありませんでした。matplotlib 2.0.2 にアップグレードした後、このエラーは致命的になり、私のグーグル検索はあなたの投稿につながりました。

したがって、セレニティのアドバイスに従って、手動で行を変更する必要があります

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

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

私にとって、これは 3452 と 3644 でしたpath_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 に答える
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 に答える