MemoryError с numpy arange - PullRequest
       13

MemoryError с numpy arange

0 голосов
/ 18 сентября 2018

Я хочу создать массив степеней 10 в качестве метки для оси Y графика.Я использую plt.yticks() с matplotlib, импортированным как plt, но это все равно не имеет значения.У меня есть графики, где ось у меняется от 1e3 до 1e15.Это бревенчатые участки.Matplotlib автоматически отображает те с тиками с шагами 1e2, и я хочу вместо этого иметь шаг 10 (для того, чтобы иметь возможность правильно использовать минорты).

Я хочу использовать команду plt.yticks(numpy.arange(1e3, 1e15, 10)), как сказаноно numpy.arange(1e3, 1e15, 10) приводит к ошибке MemoryError.Разве он не должен выводить массив длиной 13?Почему память переполняется?

Как обойти эту проблему и не создавать массив вручную?

Я также пытался использовать встроенный range, но он не будет работать с плавающей запятой.

Спасибо.

Ответы [ 4 ]

0 голосов
/ 18 сентября 2018

Альтернативный способ сделать это, вместо явного определения позиций тиков, - это использовать LogLocator из модуля matplotlib.ticker и вручную увеличить количествотики (по умолчанию он будет пытаться установить симпатичное количество тиков; т.е. чтобы он не выглядел слишком тесным).

В этом примере я установил число тиков в 13 на Axes справа (с использованием numticks=13), и вы можете видеть, что это увеличивает количество тиков, поэтому один на каждую целую степень равен 10.

import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

# Create figure and axes
fig, (ax1, ax2) = plt.subplots(ncols=2)

# Make yscale logarithmic
ax1.set_yscale('log')
ax2.set_yscale('log')

# Set y limits
ax1.set_ylim(1e3, 1e15)
ax2.set_ylim(1e3, 1e15)

# On ax2, lets tell the locator how many ticks we want
ax2.yaxis.set_major_locator(ticker.LogLocator(numticks=13))

ax1.set_title('default ticks')
ax2.set_title('LogLocator with numticks=13')

plt.show()

enter image description here

РЕДАКТИРОВАТЬ:

Чтобы добавить второстепенные тики с помощью этого метода, мы можем использовать другой LogLocator, и на этот раз установить опцию subs, чтобы сказать, где мы хотим, чтобы незначительные тики в каждом десятилетии,Здесь я не установил второстепенных тиков на каждый 0.1, потому что это было бы слишком тесно, так что просто сделайте для подмножества.Обратите внимание, что если вы устанавливаете второстепенные тики, как это, вам также необходимо отключить метки тиков для второстепенных тиков, используя NullFormatter.

ax2.yaxis.set_major_locator(ticker.LogLocator(numticks=13))
ax2.yaxis.set_minor_locator(ticker.LogLocator(subs=(0.2,0.4,0.6,0.8),numticks=13))
ax2.yaxis.set_minor_formatter(ticker.NullFormatter())

enter image description here

0 голосов
/ 18 сентября 2018

В этом случае функция logspace от numpy больше подходит.Ответ на пример: np.logspace(3,15,num=15-3+1, endpoint=True)

0 голосов
/ 18 сентября 2018

Вы также можете просто сделать:

10. ** np.arange(3,16)

, что важен десятичный знак, так как без него вы переполните тип по умолчанию int32 dtype для целых чисел

0 голосов
/ 18 сентября 2018

Попробуйте logspace из NumPy как

plt.yticks(numpy.logspace(3, 15, 13))

Здесь вы даете начальный и последний показатель степени (степени 10) и количество точек данных между ними. Если вы напечатаете вышеупомянутую сетку, вы получите следующее

array([1.e+03, 1.e+04, 1.e+05, 1.e+06, 1.e+07, 1.e+08, 1.e+09, 1.e+10,
   1.e+11, 1.e+12, 1.e+13, 1.e+14, 1.e+15])
...