2016-02-04 1 views
0

Я пытаюсь работать с базой. Я установил matplotlib, baseemap и Pillow успешно и могу строить основные сюжеты. Код ниже работает для меня.Использование базовой карты Python etopo() генерирует IndexError

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

+0

Мне удалось заставить этот код работать на другом компьютере под управлением 64-разрядного Python 3.5.1 (также Windows 8.1). Возможно ли, что с этим связано 32-битное и 64-битное? – DataBandit

ответ

3

Если вы только тестирование 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() 
+1

Спасибо, ваше решение работает. Тем не менее, я все еще немного смущен. Мой исходный код на самом деле связан с учебным пособием по базовым картам (платный курс Udemy, поэтому я не могу предоставить ссылку, к сожалению), и он отлично работал в учебнике. Я действительно смог заставить свой исходный код работать на другом компиле, работающем на 64-битном Python. – DataBandit

+0

Несомненно, @DataBandit. Я сделал большое редактирование, потому что после большего тестирования на моей установке проекция мельнера с настройками по умолчанию отлично работает с '.etopo()'. Одна вещь для сравнения на каждой из разных машин: внутри вашего интерпретатора python введите 'import mpl_toolkits.basemap', а затем' print mpl_toolkits.basemap .__ version__' и посмотрите, являются ли они разными версиями. FYI Я нахожусь на mac с 64-битным python 2.7, и ваш код дает такую ​​же ошибку на моей машине. – fslick

+1

Базовая версия компилятора, выдающая ошибку, составляет 1.0.8. На данный момент у меня нет доступа к другому компьютеру. Что-то интересное в том, что вы опубликовали: он работает, но если я изменю 'm = Basemap ('mill')' на 'm = Basemap (projection = 'mill')', это не сработает! С той же ошибкой, что и выше. – DataBandit

2

Это, как представляется, incompatibilty между базовой картой и недавно NumPy версии. Предлагаемое решение возвращается к проекции по умолчанию, поскольку первое ключевое слово - не проекция, а llcrnrlat.

Я не понял, что именно вызывает IndexError, однако возвращается к более старой версии numpy. Кажется, что numpy 1.9.2 является последней рабочей версией. Возможно, что-то было изменено командой concatenate.

Edit: я изменил линию 4167 в BaseMap/INIT .py, чтобы получить тот же результат, чем это должно быть с более старыми версиями 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 

конкатенации вдоль 1D массивов и ненулевой оси, теперь осуждается, именно поэтому исключение.