Как использовать большую сетку без ошибок памяти в Python? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь воспроизвести следующий график:

enter image description here

Я работаю с функцией двух переменных: skin_depth(T,rho).Поэтому я решил использовать meshgrid и построить график, используя contourlines.Проблема в том, что он работает только для небольшого диапазона T и rho.Когда я пытаюсь использовать диапазон для осей x и y, как на рисунке выше, появляется следующее сообщение об ошибке:


MemoryError Traceback (последний последний вызов) в () 1 T =np.linspace (0,01,10000,10000) 2 rho = np.linspace (0,1,100000,1000000) ----> 3 X, Y = np.meshgrid (T, rho)

C: \Пользователи \ paula \ Anaconda2 \ lib \ site-packages \ numpy \ lib \ function_base.pyc в сетке сетки (* xi, ** kwargs) 4696 4697, если copy_: -> 4698 output = [x.copy () для x в выходных данных]4699 4700 обратный вывод

MemoryError:

Кто-нибудь знает способ избежать этого?Ниже мой код.

import numpy as np
import matplotlib.pyplot as plt

T = np.linspace(0.01,100,10000)
rho = np.linspace(0.1,1000,10000)
X, Y = np.meshgrid(T,rho)

skin_depth = 500*(np.sqrt(Y*X))

levels=np.array([10,20,30,40,50,60,70,80,90,100,200,300,400,500,600,700,800])

fig = plt.figure(figsize=(10,10))
CS = plt.contour(X,Y,skin_depth, levels, colors='k')
plt.clabel(CS, fontsize=9, inline=1, inlinespacing=1, fmt='%1.f')
plt.grid(True,which="both",ls="-")
plt.title('Skin Depth (m)')
plt.xlabel('Period [T(s)] ')
plt.ylabel('Resistivity [rho(ohm.m)]')
plt.xscale('log')
plt.yscale('log')
plt.show()

1 Ответ

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

Я думаю, что вы создаете больше чем необходимые промежуточные точки сетки с вашим linspace для вашего графика.

Вы делали:

T = np.linspace(0.01,10000,10000)
rho = np.linspace(0.1,1000000,1000000)
print (len(T)*len(rho))
> 10000000000

, что означает, что вы создавали сетку из 10 миллиардов точек данных.

На самом деле вам нужен logspace.Нужные точки сетки: 0.01, 0.02, 0.03, ... 0.1, 0.2, 0.3, ...1, 2, 3,... 10, 20, 30, ... 100, 200, 300,...1000, 2000, 3000,... и т. Д., Поскольку вы находитесь в логарифмической системе координат.Вы можете напечатать T и rho сейчас, чтобы понять, что я имею в виду.Для этого вам нужно всего лишь 3402 точек данных .

Таким образом, вы в основном создавали на семь порядков * на 1020 * больше точек данных, чем необходимо.

Вот измененные исходные данные с выходными данными.Вы можете добавить больше уровней, чтобы они отображались сплошными черными линиями

a1 = np.logspace(-2, 4, 7)  # Alternative a1 = 10.**(np.arange(-2, 5))
a2 = np.arange(1,10,1)
a3 = np.logspace(-1, 4, 6)  # Alternative a3 = 10.**(np.arange(-1, 5))

T = np.outer(a1, a2).flatten()
rho = np.outer(a3, a2).flatten()

X, Y = np.meshgrid(T,rho)

fig = plt.figure(figsize=(8,5.5))
# Your code here

Выход

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...