IndexError при использовании некоторых проекций с базовой картой и контуром в Python 3.6.1

Я использую Python 3.6.1 64 бита, Qt 5.6.2, PyQt5 5.6 на Ubuntu 16.4 с версией базовой карты 1.0.7, matplotlib 2.0.2. Когда я пытаюсь использовать 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 , * аргументы, ** 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. Этот вопрос кажется таким же, как этот , на который не ответили.

Любые идеи?


person lanadaquenada    schedule 30.06.2017    source источник


Ответы (2)


В ответ на ланаадакенаду (кажется, я не могу комментировать)

Основываясь на сообщении Serenity, вам действительно нужно изменить код базовой карты, а не ваш код. Базовая карта устарела и больше не поддерживается. Он был создан, когда был выпущен python 2.x, и, похоже, он использовал целочисленное деление python 2. Python 3 теперь выполняет деление «правильно», но был создан некоторый старый код, чтобы воспользоваться преимуществами разделения Python 2.

При использовании python3 и matplotlib 1.5.3 я получал предупреждение об этой проблеме, но это не было фатальным. После обновления до matplotlib 2.0.2 эта ошибка стала фатальной, и мой поиск в Google привел к вашему сообщению.

Поэтому, следуя совету Серенити, вам необходимо вручную изменить строки с помощью

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

to

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, похоже, дало правильные результаты.

Я надеюсь, что это не повлечет за собой непредвиденных последствий где-либо еще, хотя базовая карта была разработана с использованием старого целочисленного деления, поэтому я предполагаю, что все в порядке.

person Simon    schedule 12.07.2017
comment
Огромное спасибо! :) Это устранило мою проблему. Если это помогает кому-то другому, я использую anaconda, и файл находился в ~ / anaconda3 / lib / python3.6 / site-packages / mpl_toolkits / basemap / __ init__.py - person lanadaquenada; 12.07.2017

Это поведение является следствием целочисленного деления 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.

person Serenity    schedule 30.06.2017
comment
Я не понимаю, как применить решение 1. Не могли бы вы объяснить, как это сделать в моем примере? Спасибо - person lanadaquenada; 04.07.2017
comment
Установите python3. - person Serenity; 12.10.2017