2017-09-18 6 views
-1

私はpythonとmatplotlibを使用して特定のパラメータをプロットするためにgfs天気データに取り組んでいます。それはgrib2ファイルなので、私はファイルからデータを抽出するためにwgrib2を使用しています(私はpygribを認識しています)。これらの抽出された変数(緯度、経度、および温度)は、うんざりしています。私はあなたのレビューのためにlatlondataの値を付けています。私はプロットのために使用していたコードの部分がある: -有効なnumpy配列がIndexErrorを生成します:

lat = # load from attached lat file 
lon = # load from attached lon file 
data = # load data from data file 
plt.figure() 
m = Basemap(projection='mill', lat_ts=10, llcrnrlon=lon.min(), urcrnrlon=lon.max(), llcrnrlat=lat.min(), urcrnrlat=lat.max(), 
      resolution='c') 
x, y = m(lat, lon) 
cs = m.contourf(x, y, data) 
m.drawcoastlines() 
m.fillcontinents() 
m.drawmapboundary() 
plt.show() 

さて、私はプロットのためのmatplotlibのcountorf機能を使用する場合、それは次のエラーを生成します -

File "wgrib2.py", line 145, in <module> 
    cs = m.contourf(x, y, data) 
    File "/usr/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py", line 521, in with_transform 
    return plotfunc(self,x,y,data,*args,**kwargs) 
    File "/usr/lib/python3.6/site-packages/mpl_toolkits/basemap/__init__.py", line 3644, in contourf 
    xx = x[x.shape[0]/2,:] 
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices 

は、誰かが解決するために私を助けることができますこの問題?要求されるようにここで

は、(実際のファイルは、上記のリンクでアップロードされている)、最小限の例である: -

#!/usr/bin/python2 
# -*- coding: utf-8 -*- 
from __future__ import print_function, unicode_literals, division 
import os 
import subprocess 
import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 

lat = np.loadtxt("lat.txt") 
lon = np.loadtxt("lon.txt") 
data = np.loadtxt("data.txt") 
plt.figure() 
m = Basemap(projection='mill', lat_ts=10, llcrnrlon=lon.min(), urcrnrlon=lon.max(), llcrnrlat=lat.min(), urcrnrlat=lat.max(), 
      resolution='c') 
x, y = m(lat, lon) 
cs = m.contourf(x, y, data) 
m.drawcoastlines() 
m.fillcontinents() 
m.drawmapboundary() 
plt.show() 

編集もう一度ファイルをアップロード1

データの次元に問題があるようです。 wgrib2からnumpy配列への出力は、lat、lon、およびdataの値が(259920、)の単一ディメンションです。私はpygribでチェックして、720 x 361 = 259920につながる(720、361)の形を生成します。したがって、データがnumpyに変換される問題があるようです。

+1

外部データに依存しない[mcve]を作成してください。ちょうど "それのような"ものを使用してください。たぶん 'np.random.random()'は助けることができますか?また、「ベースマップ」とは何ですか? – MSeifert

+1

'x.shape [0]/2'で判断すると、Python 3にPython 2パッケージをインストールしたようです。 – user2357112

+0

@ user2357112、私はこれをpipしませんでした。これは、Arch Linuxの下でパッケージマネージャー、pacmanを使用するデフォルトのインストールです。 –

答えて

1

Python 3.5ではベースマップ1.1.0でコードにエラーが発生しないため、ベースマップをアップグレードすると修正されるはずです。実際にPython 2(最小限の例で示唆されている)を実行している場合は、__future__のインポートからdivisionを削除すれば十分でしょう。特に

、このMCVEはエラーを生成しません:

from __future__ import print_function, unicode_literals, division 
import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.basemap import Basemap 

lat = np.linspace(-90, 90, 180) 
lon = np.linspace(-180, 180, 360) 
lat, lon = np.meshgrid(lat, lon) 
data = np.random.randn(360, 180) 
plt.figure() 
m = Basemap(projection='mill', lat_ts=10, llcrnrlon=lon.min(), urcrnrlon=lon.max(), llcrnrlat=lat.min(), urcrnrlat=lat.max(), 
      resolution='c') 
x, y = m(lon, lat) 
cs = m.contourf(x, y, data) 
m.drawcoastlines() 
m.fillcontinents() 
m.drawmapboundary() 
plt.show() 

何らかの理由で問題が解決しないと、あなたは右ここerroring問題にパッチを適用したい場合は、basemapソースコードに行くことができますxx = x[x.shape[0]/2,:]をxx = x[int(x.shape[0]/2),:]に変更してください。私がBenから聞いたことは、これを行うと他の互換性の問題に直面している可能性が高いことですが、かもしれないこのコードは現在動作しています。

basemapはPython 3をサポートしておらず、推奨されていません。 Basemap(Ben Root)のコア開発者は、Python 2が2020年にセキュリティアップデートを受信しなくなったときでさえ、放棄されてPython 3に移植されないため、ユーザーに使用を中止するよう促しています。cartopyを代わりに使用することを提案します。このすべてはScipy 2017のBen Rootによって言われました。

+0

Basemapが2020年以上維持されないという事実は、今は動作してはならないということを意味するものではありません。上記のコードがbasemapとpython 3で動作するはずでない理由が分からない限り、これは有用な答えだとは思わない。 – ImportanceOfBeingErnest

+0

私はコア開発者からの情報を伝えています。私が言ったことはすべて客観的に真実です(私は彼らが言ったことを言っています)。そして、そのラインエラーは明確に2/3の互換性の問題を持っています。 –

+0

したがって、ソリューションはベースマップの最新バージョンをインストールすることです。それはそれです。将来ベースマップが継続される予定の場合は、ここではまったく関係ありません(あなたが緊急にそのことを知りたい場合は、もちろんコメントを追加することができます)。 – ImportanceOfBeingErnest

関連する問題